problème StringRegExpReplace

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

problème StringRegExpReplace

#1

Message par papami »

Bonsoir à tous

Je 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
Cette formulation n'est pas triable sauf à ajouter des espaces en tête et en tirer un nombre de caractères constant.
Je le fais actuellement ligne à ligne après split, mais il me semble qu'une bonne instruction StringRegExpReplace sur le fichier avant split serait beaucoup plus élégante.

Mais j'avoue ne rien y connaître dans cette instruction :( ... et hélas ne rien comprendre à la doc !

Si un spécialiste de la chose peut m'aider, merci d'avance !
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6090
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: problème StringRegExpReplace

#2

Message par mikell »

C'est très probablement faisable mais la question n'est pas très claire
L'idéal serait de fournir un petit exemple précis du texte à traiter et du résultat souhaité
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: problème StringRegExpReplace

#3

Message par papami »

Bonsoir,
Et merci de votre attention ,
Mais je n'ai pas tourné ma langue x fois avant d'appeler au secours !
En effet je voulais recadrer des données pour permettre un tri correct, mais en regardant un peu plus attentivement la doc ListVew je vois
(mieux vaut tard ...) que cela se fait automatiquement avec _GUICtrlListView_JustifyColumn !!! :oops:
Alors mes excuses pour le dérangement !
Cordialement
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: problème StringRegExpReplace

#4

Message par papami »

Encore moi

Je reprends :
Dans un fichier (genre dir) j'ai dans chaque ligne de texte une valeur entre virgules présentée ainsi
,2 Ko,
,100Ko,
,10 Ko,
,1Ko,
etc...
qui ne peut pas se trier correctement (même en justifiant la colonne listView à droite, contrairement à ce que j'ai dit précédemment)
Pour cela il faut partir de la forme
,__2 Ko,
,100 Ko,
,_10 Ko,
,__1Ko,
etc...
ici espaces figurés par _ (qui fonctionnerait aussi)

Donc actuellement je lis le fichier dans une table intermédiaire pour dépiauter chaque ligne et ajouter des espaces en tête avec un
StringRight(" " & $valeur,9) répété
Cela fonctionne mais un seul StringRegExpReplace sur le fichier complet serait plus simple et élégant

Mais ché pô m'servire de ça :(

Qui sait, qui sait, qui sait (air connu !)

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

Re: problème StringRegExpReplace

#5

Message par mikell »

Si j'ai bien compris la question, c'est le problème du tri des valeurs numériques dans une listview
Le truc c'est de créer une colonne supplémentaire cachée (ou de largeur 0), de la remplir avec les données "traitées" , par exemple comme ça :
$a1 = 2
$a2 = 123
Msgbox(0,"", _arrange($a1) & @crlf & _arrange($a2) )

Func _arrange($valeur)
   Return StringFormat("%05i", $valeur)
EndFunc
et de faire le tri sur cette colonne
" 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
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 48
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: problème StringRegExpReplace

#6

Message par Nine »

Peut-être cela :

Code : Tout sélectionner

Exemple()

Func Exemple()
 Local $sString = ",2 Ko," & @CRLF & _
    ",100Ko," & @CRLF & _
    ",10 Ko," & @CRLF & _
    ",1Ko,"

  $sString = StringTrimRight(Execute(StringTrimRight(StringRegExpReplace($sString, "(.*?,)(\d+)(\h?)(Ko,.*)(\v*)", _
    '"$1" & StringFormat("%05i",$2) & " $4|" & '), 3)), 1)
  ConsoleWrite ($sString & @CRLF)
EndFunc
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: problème StringRegExpReplace

#7

Message par papami »

:bisou:
c'est bon 8)

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

Re: problème StringRegExpReplace

#8

Message par mikell »

:roll:
$sString = ",2 Ko," & @CRLF & _
    ",100Ko," & @CRLF & _
    ",10 Ko," & @CRLF & _
    ",1Ko,"

$sString = Execute("'" & StringRegExpReplace($sString, ",(\d+)\h*Ko,", "' & ',' & StringFormat('%05i', '$1') & ' Ko,' & '") & "'")
ConsoleWrite ($sString & @CRLF)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: problème StringRegExpReplace

#9

Message par papami »

Oui, c'est parfait.
Et on peut même utiliser l'espace au lieu du 0, '% 5i' au lieu de '%05i', ce qui présente mieux pour les nombres, mais c'est aussi là que l'on peut utiliser la justification de colonne à droite.
Et c'est alors nickel.
C'est beau le StringRegExpReplace lorsqu'on sait l'utiliser :)
à+
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11638
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: problème StringRegExpReplace

#10

Message par Tlem »

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 :
  1. Lire le fichier dans une variable
  2. Traiter le contenu de la variable avec le StringRegExpReplace
  3. 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. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: problème StringRegExpReplace

#11

Message par papami »

Bonjour,
Oui c'est vrai que je ne suis pas toujours clair dans mes explications ...
Donc si on reprend : je retraite une liste "genre Dir", comme dit un peu plus haut, pour créer une ListView avec différentes possibilités d'utilisation, dont évidemment le tri par colonne.
lignes de la forme
C:\Windows\Media\,Ring10.wav,686 Ko,WAV File,18/06/2013 16:46:01,22/08/2013 08:58:07,22/08/2013 08:58:07
la virgule étant ici le séparateur
Bien entendu j'avais prévu la pagaye avec les dates, moins tout de suite avec les Ko...
Et évidemment j'ai donc d'abord usé de la "méthode traditionnelle"
pour les dates
$dx = StringMid($dx, 7, 4) & "/" & StringMid($dx, 4, 2) & "/" & StringLeft($dx, 2) & StringRight($dx, 9)
et
StringRight("________" & $valeur,9) (évoqué plus haut aussi avec un " " au lieu de " ")
après tests corrects j'ai donc pu construire ma gestion de listView. ouf :)

Mais ensuite j'ai chercher à faire "mieux" et un peu fasciné par les commandes StringRegExpReplace j'ai d'abord trouvé celle sur les dates qui d'un clic transforment en bloc la forme française en anglaise et je me suis dit pourquoi pas pour mes Ko !
Et donc en ajoutant un stringReplace les "," en "|" tout est précuit pour la ListView en trois coups de cuillère à pot :)

D'où mon appel à l'aide ici.

Maintenant je n'ai pas (encore) contrôlé le temps d'exécution de chaque formule sur une longue liste...

Concernant la compréhension du code c'est vrai pour ceux qui, comme moi, ne maîtrisent pas le StringRegExpReplace mais le résultat étant là je ne me pose pas plus de question que sur les appels aux Includes

Voilà, voilà

Cordialement et Bonne santé à tous.
Répondre