Bonsoir.
papami a écrit : ↑jeu. 18 févr. 2021 19:12Je traite une liste pouvant être importante de fichiers dont la colonne "taille" est figurée ainsi :
",x Ko," : une virgule suivie de la valeur (de 0 à 100000) suivie de Ko puis virgule
Petite question : Quelque soient les conditions, vous n'aurez jamais autre chose qu'une valeur de 0 à 100000 puis un espace puis la chaîne "Ko" ?
Jamais "1 Mo" ou 1 Go" ?
Ensuite, je souhaiterais soumettre une réflexion.
Je ne sais pas trop comment vous construisez votre tableau final, mais si j'ai bien compris, vous faites :
- Lire le fichier dans une variable
- Traiter le contenu de la variable avec le StringRegExpReplace
- Construire un tableau de plusieurs colonne à partir de la variable
J'ai essayé de voir comment il était possible de faire et j'ai donc fait quelques tests.
Comme vous ne nous donnez pas un exemple de votre fichier, j'ai imaginé ceci :
Code : Tout sélectionner
Global $File = "TestFile.txt"
Global $hFile = FileOpen($File , 2)
For $i = 1 To 1000
FileWrite($hFile, "abcdef,fichier.ext," & Random(1, 10000, 1) & " Ko,ghijk,lmnop" & @CRLF)
Next
FileClose($hFile)
Ensuite, comme je n'ai pas trouvé de fonction directe pour construire un tableau de multi-colonnes, je suis resté sur un code de base avec un tableau simple colonne, et en utilisant le code de Michel, j'ai fait ceci :
Code : Tout sélectionner
#Include<Array.au3>
Global $sString, $aString
Global $File = "TestFile.txt"
$sString = FileRead($File)
$sString = Execute("'" & StringRegExpReplace($sString, ",(\d+)\h*Ko,", "' & ',' & StringFormat('%05i', '$1') & ' Ko,' & '") & "'")
$aString = StringSplit($sString, @CRLF, 1)
_ArrayDisplay($aString)
Tel quel, ce code traitera comme demandé la chaine de la taille en Ko en rajoutant des 0 devant.
En utilisant la méthode traditionnelle, je suis arrivé à ceci :
Code : Tout sélectionner
#Include<Array.au3>
#Include<File.au3>
Global $afile
Global $File = "TestFile.txt"
_FileReadToArray($File, $afile, 5, ",")
For $i = 1 To UBound($afile) - 1
$afile[$i][2] = StringRight(" " & $afile[$i][2], 9)
Next
_ArrayDisplay($afile)
Dans ce cas précis, j'obtiens un
tableau multi-colonnes et je traite comme demandé la colonne de la taille du fichier en ajoutant des espaces, sans compter que cela fonctionnera si les valeurs sont des Ko, Mo ou Go, et si la solution de Michel de rajouter des 0 vous convient, il suffit de remplacer les espaces de la ligne 9 par des 0.
Perso, je trouve ce code pas plus compliqué, en sachant que dans le premier exemple il manque le traitement du multi-colonnes.
Et à code égale, vu la durée du temps de traitement, celui-ci ne serait clairement pas un critère de choix.
Maintenant, peut-être ne traitez-vous pas les données de cette manière, et dans ce cas je serais curieux de savoir ce qui vous a amené à une telle réflexion.
Je vous confirme que les expressions régulières "c'est beau lorsqu'on sait les utiliser", mais l'écriture d'un motif peux être assez long et fastidieux, pour un résultat qui ne sera pas forcément plus rapide. Vous économiserez sans aucun doute plusieurs lignes de code, mais ce sera au détriment de la compréhension lorsque que vous ou quelqu'un d'autre lirez le code dans quelques mois ou années. Je vous conseille de ne surtout pas oublier de détailler en commentaire ce que fait la RegExp.
