problème StringRegExpReplace
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
problème StringRegExpReplace
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 !
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 !
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: problème StringRegExpReplace
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'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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Re: problème StringRegExpReplace
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 !!!
Alors mes excuses pour le dérangement !
Cordialement
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 !!!
Alors mes excuses pour le dérangement !
Cordialement
Re: problème StringRegExpReplace
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
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
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: problème StringRegExpReplace
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 :
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 :
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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Re: problème StringRegExpReplace
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
Re: problème StringRegExpReplace
c'est bon
Merci !
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: problème StringRegExpReplace
$sString = ",2 Ko," & @CRLF & _
",100Ko," & @CRLF & _
",10 Ko," & @CRLF & _
",1Ko,"
$sString = Execute("'" & StringRegExpReplace($sString, ",(\d+)\h*Ko,", "' & ',' & StringFormat('%05i', '$1') & ' Ko,' & '") & "'")
ConsoleWrite ($sString & @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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Re: problème StringRegExpReplace
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
à+
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
à+
- Tlem
- Site Admin
- Messages : 11773
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: problème StringRegExpReplace
Bonsoir.
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 :
Comme vous ne nous donnez pas un exemple de votre fichier, j'ai imaginé ceci :
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 :
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 :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.
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
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)
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)
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)
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.
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é".
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é".
Re: problème StringRegExpReplace
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
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
et
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.
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.