[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 : 125
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

[UDF] Manipulations de chaines

#1

Message par Numeric »

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 : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [UDF] Manipulations de chaines

#2

Message par jguinch »

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
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Manipulations de chaines

#3

Message par mikell »

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 : 125
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: [UDF] Manipulations de chaines

#4

Message par Numeric »

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