[UDF] Manipulations de chaines

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 106
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

[UDF] Manipulations de chaines

#1

Message par Numeric » lun. 21 nov. 2016 10:25

Salut :D
Quoi de plus utile que des fonctions toutes prêtes, Voulez vous manipuler à guise vos chaines et plus rapidement? alors cet udf est fait pour vous.
Classer les mots par ordre alphabétique, connaitre le nombre et l'emplacement des mots, de même que les mots qui les précèdent et qui les succèdent. bref, Tout faire avec les chaines de caractères. :lol:
#include <Array.au3>

Global $WinAPI_DataSepChar = Opt("GUIDataSeparatorChar")



; #FUNCTION# ====================================================================================================================
; Name ..........: StringInsert
; Description ...: Insert une chaine dans une autre chaine
; Syntax ........: StringInsert($sString[, $iIndex = -1[, $aValue = " "[, $aLeftSpace = ""[, $aRightSpace = ""]]]])
; Parameters ....: $sString             - a string value.
;                  $iIndex              - [optional] an integer value. Default is -1.
;                  $aValue              - [optional] an array of unknowns. Default is " ".
;                  $aLeftSpace          - [optional] an array of unknowns. Default is "".
;                  $aRightSpace         - [optional] an array of unknowns. Default is "".
; Return values .: La nouvelle chaine
; Author ........: Numeric
; Modified ......:
; Remarks .......: Par defaut il ny pas'espaces "apres" la chaine a ajouter. vous pouvez les ajouter avec le parametre $aRightSpace ="   "
; Related .......: _StrinInsert()
; Example .......: No
; ===============================================================================================================================
Func StringInsert($sString, $aValue = " ", $iIndex = -1, $aLeftSpace = " ", $aRightSpace = "")

        Local $nString = (IsString($sString) = 1) ? (String($sString)) : (String($sString)), $sLength = StringLen($nString)
        $iIndex = ($iIndex = -1 Or $iIndex = Default) ? ($sLength + 1) : ($iIndex)
        $aValue = ($aValue = Default) ? (" ") : ($aValue)
        $aLeftSpace = ($aLeftSpace = Default) ? (" ") : ($aLeftSpace)
        $aRightSpace = ($aRightSpace = Default) ? ("") : ($aRightSpace)
        Local $eIndex = Int($iIndex), $aNew_String = $aLeftSpace & $aValue & $aRightSpace, _
                        $RetString = StringTrimLeft($nString, $eIndex)
        Return StringLeft($sString, $eIndex) & $aNew_String & $RetString

EndFunc   ;==>StringInsert


; #FUNCTION# ====================================================================================================================
; Name ..........: StringWordToUpper
; Description ...: Converti en Majuscule un mot dans une Chaine
; Syntax ........: StringWordToUpper($String, $SubString)
; Parameters ....: $String              - an unknown value.
;                  $SubString           - an unknown value.
;                  $iOccurence          _ default value is 0
; Return values .: Chaine converie en Majuscule, en cas d'echec la fonction retourne l'ancienne chaine
; Author ........: Numeric
; Modified ......:
; Remarks .......: $iOccurrence permet de modifier le nombre de fois voulue $SubString a partir de la guauche
;                  Si $ioccurence = 0 alors tous les mots egaux à $SubString sont modifiés
; Example .......: No
; ===============================================================================================================================
Func StringWordToUpper($String, $SubString, $iOccurrence = 0)
        Local $iRet = $String
        If StringInStr($String, $SubString) Then $iRet = StringReplace($String, $SubString, StringUpper($SubString), Int($iOccurrence))
        Return $iRet
EndFunc   ;==>StringWordToUpper



; #FUNCTION# ====================================================================================================================
; Name ..........: WinGetAllStringWords
; Description ...: Obtenir tous les mots dans une chaine| obtenir le nombre de mots dans une chaine
; Syntax ........: WinGetAllStringWords(Byref $String[, $bNumber = False])
; Parameters ....: $String              - [in/out] an unknown value.
;                  $bNumber             - [optional] a boolean value. Default is False.
; Return values .: Tableau des mots | nombre de mots dans $String
; Author ........: Numeric
; Modified ......:
; Remarks .......: $bNumber = true retourne le nombre de mots dans la chaine
;                  Par contre s'il est False , alors il retourne un tableau contenant tous les mots de la chaine
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func WinGetAllStringWords(ByRef $String, $bNumber = False)

        Local $nString, $STRINGisMarked, $aSplit, $aResult, $GetError
        $nString = (IsString($String) = 1) ? (String($String)) : (String($String))
        $STRINGisMarked = StringStripWS(StringReplace($nString, " ", $WinAPI_DataSepChar), 0x8)
        $aSplit = StringSplit(String($STRINGisMarked), $WinAPI_DataSepChar)

        $GetError = @error
        Switch $GetError
                Case 1
                        $aResult = ($bNumber = False) ? ($nString) : (1)
                Case Else
                        $aResult = ($bNumber = False) ? ($aSplit) : (UBound($aSplit) - 1)
        EndSwitch

        Return $aResult
EndFunc   ;==>WinGetAllStringWords


; #FUNCTION# ====================================================================================================================
; Name ..........: StringCharacterToUpper
; Description ...: Converti en majuscule des caracteres donnés dans une phrase
; Syntax ........: StringCharacterToUpper($String, $SubString)
; Parameters ....: $String              - an unknown value.
;                  $SubString           - an unknown value.
; Return values .: Succes = Nouvelle chaine avec les caracteres modifiés | echec = ancienne chaine sans modifications
; Author ........: Numeric
; Modified ......:
; Remarks .......: Les caracteres peuvent vous donner l'impression d'etre un mot, mais la fonction ne considerera pas le mot mais les
;                  lettres constituant le mot.
; Example .......: Yes
; ===============================================================================================================================

#cs

        Local $exemple = "Salut mon ami, comment vas-tu? tu as mangé comme tu l'avais dit!"
        Local $CallFunc = StringCharacterToUpper($exemple, "ami")
        MsgBox(48,"StringCharacterToUpper",$CallFunc)

#ce

Func StringCharacterToUpper($String, $SubString)

        $sString = (IsString($String) = 1) ? (String($String)) : (String($String))
        Local $aNex_String = $String, $aLetter, $aLast = -1, $getValue, $iRet, $sLenght = Number(StringLen($SubString))

        For $i = 1 To $sLenght
                $aLast += 1
                $aLetter = StringTrimLeft(StringLeft($SubString, $i), $aLast)
                $aNex_String &= $WinAPI_DataSepChar & StringReplace($aNex_String, $aLetter, StringUpper($aLetter))
        Next

        $getValue = StringSplit($aNex_String, $WinAPI_DataSepChar)
        $iRet = (IsArray($getValue) = 1) ? ($getValue[$getValue[0]]) : (StringTrimLeft($aNex_String, 1))

        Return $iRet
EndFunc   ;==>StringCharacterToUpper


; #FUNCTION# ====================================================================================================================
; Name ..........: StringGetLastWord
; Description ...: Obtenir dans un tableau tous mots precedants un autre mot donné
; Syntax ........: WordGetLastWord($String, $iWord[, $iFlag = 0])
; Parameters ....: $String              - an unknown value.
;                  $iWord               - an integer value.
;                  $iFlag               - [optional] an integer value. Default is 0.
; Return values .: Les mots precedents le mot passé en $iWord | -1 si $iWord n'est pas dans $String | $False si echec
; Author ........: Numeric
; Modified ......:
; Remarks .......: Le flag nous permet d'obtenir le premier mot precedant $iWord ou tous les mot le Precedant
; Related .......:
; Link ..........:
; Example .......: no
; ===============================================================================================================================
Func StringGetLastWord($String, $iWord, $iFlag = 0)

        If StringInStr($String, $iWord) = 0 Then Return SetError(@error, @extended, -1); specified word doesnt exist in string
        Local Const $OptSymbol = "__"
        Local $sFirstMade, $sBetween, $aDjust, $aRepTest, $aResult, $Case = ""
        $sFirstMade = StringReplace($String, " ", $OptSymbol)
        $aDjust = $OptSymbol & $sFirstMade
        $aRepTest = StringReplace($aDjust, String($OptSymbol & $iWord & $OptSymbol), $WinAPI_DataSepChar)
        $sBetween = StringSplit($aRepTest, $OptSymbol)
        Local $GetLastWord[UBound($sBetween) + 1]
        Local $aCount = -1
        If IsArray($sBetween) Then
                For $j = 0 To UBound($sBetween) - 1
                        If StringInStr($sBetween[$j], $WinAPI_DataSepChar) Then
                                $aCount += 1
                                $GetLastWord[$aCount] = StringSplit($sBetween[$j], $WinAPI_DataSepChar)[StringSplit($sBetween[$j], $WinAPI_DataSepChar)[0] - 1]
                        EndIf
                Next
                ReDim $GetLastWord[$aCount + 1]
                If IsArray($GetLastWord) Then $Case = "[0]"
                $aResult = ($iFlag = 1) ? ($GetLastWord & $Case) : ($GetLastWord)
                Return $aResult
        EndIf
        Return False
EndFunc   ;==>StringGetLastWord


; #FUNCTION# ====================================================================================================================
; Name ..........: StringGetNextWord
; Description ...:
; Syntax ........: WordGetNextWord($String, $iWord[, $iFlag = 0])
; Parameters ....: $String              - an unknown value.
;                  $iWord               - an integer value.
;                  $iFlag               - [optional] an integer value. Default is 0.
; Return values .: Les mots precedents le mot passé en $iWord | -1 si $iWord n'est pas dans $String | $False si echec
; Author ........: Numeric
; Modified ......:
; Remarks .......: Le flag nous permet d'obtenir le premier mot precedant $iWord ou tous les mot le Precedant
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func StringGetNextWord($String, $iWord, $iFlag = 0)

        If StringInStr($String, $iWord) = 0 Then Return SetError(@error, @extended, -1); specified word doesnt exist in string
        Local Const $OptSymbol = "__"
        Local $sFirstMade, $sBetween, $aDjust, $aRepTest, $aResult, $Case = ""
        $sFirstMade = StringReplace($String, " ", $OptSymbol)
        $aDjust = $OptSymbol & $sFirstMade
        $aRepTest = StringReplace($aDjust, String($OptSymbol & $iWord & $OptSymbol), $WinAPI_DataSepChar)
        $sBetween = StringSplit($aRepTest, $OptSymbol)
        Local $GetLastWord[UBound($sBetween) + 1]
        Local $aCount = -1
        If IsArray($sBetween) Then
                For $j = 0 To UBound($sBetween) - 1
                        If StringInStr($sBetween[$j], $WinAPI_DataSepChar) Then
                                $aCount += 1
                                $GetLastWord[$aCount] = StringSplit($sBetween[$j], $WinAPI_DataSepChar)[StringSplit($sBetween[$j], $WinAPI_DataSepChar)[0]]
                        EndIf
                Next
                ReDim $GetLastWord[$aCount + 1]
                If IsArray($GetLastWord) Then $Case = "[0]"
                $aResult = ($iFlag = 1) ? ($GetLastWord & $Case) : ($GetLastWord)
                Return $aResult
        EndIf
        Return False
EndFunc   ;==>StringGetNextWord


; #FUNCTION# ====================================================================================================================
; Name ..........: WordNumberInStr
; Description ...: Obtient le nombre de fois qu'un mot apparait dans une chaine
; Syntax ........: WordNumberInStr($String, $iWord[, $CaseSENSE = 0])
; Parameters ....: $String              - an unknown value.
;                  $iWord               - an integer value.
;                  $CaseSENSE           - [optional] an unknown value. Default is 0.
; Return values .: Nombre de Fois que le mot $iWord existe dans $String| si echec retourne False et -1 si $iWord ne figure pas dans $String
; Author ........: Numeric
; Modified ......:
; Remarks .......:
; Related .......: StringInStr; avec extended Amelioré
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WordNumberInStr($String, $iWord, $CaseSENSE = 0)

        Local $sVerify, $aSplit, $aResult, $GetError, $aRetMODE = False, $aNum = 0
        $String = (IsString($String) = 1) ? (String($String)) : (String($String))
        If Not StringInStr($String, $iWord) <> 0 Then Return SetError(@error, @extended, -1)
        $sVerify = StringStripWS($WinAPI_DataSepChar & StringReplace($String, " ", $WinAPI_DataSepChar), 8)
        $aSplit = StringSplit(String($sVerify), $WinAPI_DataSepChar)
        $GetError = @error
        Switch $GetError
                Case 1
                        If StringInStr($String, $iWord, $CaseSENSE) <> 0 Then
                                $aNum = 1
                        EndIf
                Case Else
                        For $j = 0 To UBound($aSplit) - 1
                                If StringCompare($aSplit[$j], $iWord, $CaseSENSE) = 0 Then
                                        $aNum += 1
                                EndIf
                        Next
        EndSwitch
        $aRetMODE = ($aNum = 0) ? (False) : ($aNum)
        Return $aRetMODE
EndFunc   ;==>WordNumberInStr


; #FUNCTION# ====================================================================================================================
; Name ..........: WordMaxLength
; Description ...: Obtient les mots le ou les plus longues d'une chaine
; Syntax ........: WordMaxLength($String[, $s__bVisible = False])
; Parameters ....: $String              - an unknown value.
;                  $s__bVisible         - [optional] a string value. Default is False.
; Return values .: Liste de tous les mots les plus long ou leur nombre de caracteres (selon le $Filag $s__bVisible
; Author ........: Numeric
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func WordMaxLength($String, $s__bVisible = False)

        Local $aWords, $aRetMODE, $isU_Bound, $GetMaxLen, $Wcount = -1
        $aWords = WinGetAllStringWords($String, False)
        $isU_Bound = UBound($aWords) + 1
        Local $StockLen[$isU_Bound]
        Local $StockMaxChar[$isU_Bound], $own = -1

        For $j = 0 To $isU_Bound - 2
                $StockLen[$j] = Number(StringLen($aWords[$j]))
        Next

        ReDim $StockLen[$isU_Bound]
        $GetMaxLen = _ArrayMax($StockLen, 1)

        For $i = 0 To $isU_Bound - 2
                If StringLen($aWords[$i]) = $GetMaxLen Then
                        $Wcount += 1
                        $StockMaxChar[$Wcount] = $aWords[$i]
                EndIf
        Next

        ReDim $StockMaxChar[$Wcount + 1]
        $aRetMODE = ($s__bVisible = False) ? ($GetMaxLen) : ($StockMaxChar)

        Return $aRetMODE
EndFunc   ;==>WordMaxLength


; #FUNCTION# ====================================================================================================================
; Name ..........: aArrayToStringAlphaOrder
; Description ...: Classez par ordre alphabetique , les elements d'un tableau
; Syntax ........: aArrayToStringAlphaOrder($sArray[, $AlphaOrder = "A-Z"])
; Parameters ....: $sArray              - a string value.
;                  $AlphaOrder          - [optional] an unknown value. Default is "A-Z".
; Return values .: Tableau des elements classes par ordre Alphabetique| echec : -1 si $sArray n'est pas un tableau et
;                 -2 si $AlphaOrder n'est pas valide
; Author ........: Numeric
; Modified ......:
; Remarks .......: il y a l'ordre A-Z et l'ordre Z-A
; Related .......:
; Link ..........:
; Example .......: Yes
;
; ===============================================================================================================================

; Region Exemple

#cs
        Local $MakeArray, $CallFunc, $2ndCall, $FuncEXstring = "Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche"
        $MakeArray = StringSplit($FuncEXstring, "|")

        $CallFunc = aArrayToStringAlphaOrder($MakeArray, "A-Z")
        _ArrayDisplay($CallFunc, "A-Z order")

        $2ndCall = aArrayToStringAlphaOrder($MakeArray, "Z-A")
        _ArrayDisplay($2ndCall, "Z-A order")
#ce

;End Region exemple


Func aArrayToStringAlphaOrder($sArray, $AlphaOrder = "A-Z")
        If Not IsArray($sArray) Then Return SetError(1, 0, -3)
        Local $AlphaInArray[27] = [0]
        Local $aList = "", $isSPLIT, $aToStr, $StrToa, $Wcnt = -1
        Local Const $alphabet = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
        Switch $AlphaOrder
                Case "A-Z"
                        $aList = $alphabet
                Case "Z-A"
                        $aList = StringReverse($alphabet)
                Case Else
                        Return SetError(@error, @extended, -2)
        EndSwitch
        $aToStr = _ArrayToString($sArray) ;To get my own delimiter( the default)
        $StrToa = StringSplit($aToStr, $WinAPI_DataSepChar);\\getting my default delimiter
        Local $isSPLIT = StringSplit($aList, ",")
        For $j = 0 To UBound($isSPLIT) - 1
                $AlphaInArray[$j] = $isSPLIT[$j]
        Next
        Local $NewConfig[$StrToa[0] + 1]
        For $w = 0 To UBound($AlphaInArray) - 1
                For $i = 0 To UBound($StrToa) - 1
                        For $Z = 1 To StringLen($StrToa[$i])
                                If StringLeft($StrToa[$i], $Z) = $AlphaInArray[$w] Then
                                        $Wcnt += 1
                                        $NewConfig[$Wcnt] = $StrToa[$i]
                                EndIf
                        Next
                Next
        Next
        ReDim $NewConfig[$Wcnt + 1]
        Return $NewConfig
EndFunc   ;==>aArrayToStringAlphaOrder
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric

Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2469
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [UDF] Manipulations de chaines

#2

Message par jguinch » lun. 21 nov. 2016 11:37

Merci pour le partage.

Par contre :
- Il n'y a pas suffisamment d'exemples
- Les entêtes de fonctions ne permettent pas de comprendre à quoi correspond chaque paramètre
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5812
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Manipulations de chaines

#3

Message par mikell » jeu. 01 déc. 2016 16:29

Numeric a écrit :Quoi de plus utile que des fonctions toutes prêtes
Comme par exemple _StringInsert ou _ArraySort ? :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 106
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: [UDF] Manipulations de chaines

#4

Message par Numeric » ven. 23 déc. 2016 17:00

Exemples
Local $AjouterChaine, $WordUpper, $WinGetAllStringWords, $StringCharacterToUpper, _
                $StringGetLastWord, $StringGetNextWord, $WordNumberInStr, $WordMaxLength, $aArrayToStringAlphaOrder, $ChaineInitiale = "Salut! à vous"

$AjouterChaine = StringInsert($ChaineInitiale,"[Chaine ajouté]", 7, "                ","                 ")
MsgBox(48,"Chaine ajoutée avec beaucoup d'espaces",$AjouterChaine)

$AjouterChaine = StringInsert($ChaineInitiale, "les amis de la communauté AutoIt. " & _
"Comment allez vous ? avant de poursuivre, Nous vous disons Merci. Les amis se doivent bien cela. Charles et Michel sont amis. ",Default,Default,Default)
MsgBox(48,"Chaine Ajoutée à la fin avec espaces",$AjouterChaine)

$WordUpper = StringWordToUpper($AjouterChaine,"AutoIt",0)
MsgBox(48,"Mot en majuscule",$WordUpper)

$WinGetAllStringWords = WinGetAllStringWords($AjouterChaine,False)
_ArrayDisplay($WinGetAllStringWords,"Liste de tous les mots de la chaine")

$WinGetAllStringWords = WinGetAllStringWords($AjouterChaine,True)
MsgBox(48,"Nombre de mots dans la chaine","Le nombre de mots dans la chaine est : " & $WinGetAllStringWords)

$StringCharacterToUpper = StringCharacterToUpper($AjouterChaine,"ami")
MsgBox(48,"A M I sont en majuscule dans la chaine",$StringCharacterToUpper)

$StringGetLastWord = StringGetLastWord($AjouterChaine, "amis", 0)
_ArrayDisplay($StringGetLastWord,"Mots precedent le mot amis")

$StringGetNextWord = StringGetNextWord($AjouterChaine,"amis",0)
_ArrayDisplay($StringGetNextWord,"Mots suivants le mot amis")

$WordNumberInStr = WordNumberInStr($AjouterChaine, "vous",0)
MsgBox(48,"le nombre de fois que le mot apparait dans la chaine est", $WordNumberInStr)

$WordMaxLength = WordMaxLength($AjouterChaine,True)
If IsArray($WordMaxLength) Then
        _ArrayDisplay($WordMaxLength,"Les mots les plus longs de la chaine sont")
Else
        MsgBox(48,"Le mot le plus long de la chaine est : ", $WordMaxLength)
EndIf

$WordMaxLength = WordMaxLength($AjouterChaine,False)
MsgBox(48,"le nombre de caractere du ou des mots mots les plus longs de la chaine", $WordMaxLength)

Local $MakeA, $Modif = StringReplace($AjouterChaine," ","|")
$MakeA = StringSplit($Modif,"|")

$aArrayToStringAlphaOrder = aArrayToStringAlphaOrder($MakeA,"A-Z")
_ArrayDisplay($aArrayToStringAlphaOrder,"Ordre A-Z")

$aArrayToStringAlphaOrder = aArrayToStringAlphaOrder($MakeA,"Z-A")
_ArrayDisplay($aArrayToStringAlphaOrder,"Ordre Z-A")
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric

Répondre