[..] Supression de lignes dans fichier TXT
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.
[..] Supression de lignes dans fichier TXT
Hello, je suis à nouveau confronté à un problème de traitement de fichier TXT.
Voici un exemple de fichier
01 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
J'aimerais en supprimer tous le bloque de texte comprenant le code "09875" y compris la ligne commencant par "05" ce qui me complique sacréme,nt la tache.
J'aimerai pouvoir écrire :
Supprimer toutes les lignes comprise entre une ligne commencant par "01" et comprenant le numéro 09875 jusqu'à la ligne commencant par "07" et comprenant aussi 09875 ...
Est ce imaginable sans REGEXP ?
Merci d'avance !! =)
Voici un exemple de fichier
01 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09874 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
J'aimerais en supprimer tous le bloque de texte comprenant le code "09875" y compris la ligne commencant par "05" ce qui me complique sacréme,nt la tache.
J'aimerai pouvoir écrire :
Supprimer toutes les lignes comprise entre une ligne commencant par "01" et comprenant le numéro 09875 jusqu'à la ligne commencant par "07" et comprenant aussi 09875 ...
Est ce imaginable sans REGEXP ?
Merci d'avance !! =)
Re: Supression de lignes dans fichier TXT
Si j'ai bien compris, tu souhaites supprimer un bloc quel qu'il soit, tant qu'il contient "09875" ?
Dans l'affirmative :
Tu lis les lignes jusqu'a tomber sur une ligne vide, tu retiens le numero de ligne.
Tu poursuit la lecture du fichier, si la chaine "09875" est trouvée alors tu retiens le numero de ligne.
Tu poursuit la lecture jusque la prochaine ligne vide.
Te voila donc avec 3 reperes qui correspondent au bloc a supprimer.
Je te laisse composer la suite.
Dans l'affirmative :
Tu lis les lignes jusqu'a tomber sur une ligne vide, tu retiens le numero de ligne.
Tu poursuit la lecture du fichier, si la chaine "09875" est trouvée alors tu retiens le numero de ligne.
Tu poursuit la lecture jusque la prochaine ligne vide.
Te voila donc avec 3 reperes qui correspondent au bloc a supprimer.
Je te laisse composer la suite.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
- sylvanie
- Niveau 11

- Messages : 1556
- Enregistré le : jeu. 26 juil. 2007 21:31
- Localisation : Paris
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
c'est pas punissable par la loi une telle remarque ?jujulips a écrit : Est ce imaginable sans REGEXP ?
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Re: [..] Supression de lignes dans fichier TXT
Lol !! Je n'ai pas encore eu le temps de me mettre au chinois ... mais c'est précu =)sylvanie a écrit :c'est pas punissable par la loi une telle remarque ?jujulips a écrit : Est ce imaginable sans REGEXP ?
- TT22
- Membre émérite

- Messages : 1566
- Enregistré le : lun. 18 avr. 2011 15:21
- Localisation : La Quatrième Dimension
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
Tien, c'est marrant parceque j'ai eu besoin exactement du même script ce matin, donc, le voici :
► Afficher le texte
Cordialement,
TT22
TT22
- sylvanie
- Niveau 11

- Messages : 1556
- Enregistré le : jeu. 26 juil. 2007 21:31
- Localisation : Paris
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
Sinon, même si les regexp vous rebute (et je peux le comprendre), voici tout de même une façon de faire avec ces dernières (avec une limitation exposée plus loins)
explications :
Ma recherche totale porte sur :
la détection éventuelle d'un retours chariot précédent 01 : \x0d?\x0a?01
puis n'importe quoi suivit de 09875 jusqu'au retours chariot (éventuel): .+09875.+\x0d\x0a?
puis je continue en sélectionnant tout en bloc [\w\d\s\x0d\x0a]+
et on s'arrête à la dernière chaîne contenant 09875 : .+09875.+\x0D?\x0a?
Limitation de la méthode :
si on tombe dans un cas comme ça :
01 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
Alors les 3 blocs disparaîtront car la première ligne détectée (en vert) est la première, puis le bloc constitué de 09876 est englobé par [\w\d\s\x0d\x0a]+ et la dernière ligne contenant 09875 est la orange
► Afficher le texte
Ma recherche totale porte sur :
la détection éventuelle d'un retours chariot précédent 01 : \x0d?\x0a?01
puis n'importe quoi suivit de 09875 jusqu'au retours chariot (éventuel): .+09875.+\x0d\x0a?
puis je continue en sélectionnant tout en bloc [\w\d\s\x0d\x0a]+
et on s'arrête à la dernière chaîne contenant 09875 : .+09875.+\x0D?\x0a?
Limitation de la méthode :
si on tombe dans un cas comme ça :
01 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09876 XXXXXXXXXXXXX
01 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
04 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
05 XXXXXXXXXXXXX XXXXXXXXXXXXX
07 XXXXXXXXXXXXX 09875 XXXXXXXXXXXXX
Alors les 3 blocs disparaîtront car la première ligne détectée (en vert) est la première, puis le bloc constitué de 09876 est englobé par [\w\d\s\x0d\x0a]+ et la dernière ligne contenant 09875 est la orange
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
- zeshrek
- Niveau 10

- Messages : 984
- Enregistré le : mer. 17 nov. 2010 09:31
- Localisation : Sur ma chaise
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
Tiens, je l'avais loupé celui là :
Y a t il un bouquin du genre "les regexp pour les nuls" ? Et si oui, y a til aussi "<<Les regexp pour les nuls>> pour les nuls" ?
Heuuuuu... on peut avoir une explication de l'explication ? Non mais franchement, les regexp c'est quand même spécial à comprendre non ?sylvanie a écrit :(...)explications :
Ma recherche totale porte sur :
la détection éventuelle d'un retours chariot précédent 01 : \x0d?\x0a?01
puis n'importe quoi suivit de 09875 jusqu'au retours chariot (éventuel): .+09875.+\x0d\x0a?
puis je continue en sélectionnant tout en bloc [\w\d\s\x0d\x0a]+
et on s'arrête à la dernière chaîne contenant 09875 : .+09875.+\x0D?\x0a?
Y a t il un bouquin du genre "les regexp pour les nuls" ? Et si oui, y a til aussi "<<Les regexp pour les nuls>> pour les nuls" ?
Si vis pacem para bellum
- mikell
- Spammer !

- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
+1zeshrek a écrit :Heuuuuu... on peut avoir une explication de l'explication ? Non mais franchement, les regexp c'est quand même spécial à comprendre non ?
Y a t il un bouquin du genre "les regexp pour les nuls" ? Et si oui, y a til aussi "<<Les regexp pour les nuls>> pour les nuls" ?
" 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 )
- sylvanie
- Niveau 11

- Messages : 1556
- Enregistré le : jeu. 26 juil. 2007 21:31
- Localisation : Paris
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
pour les tuto, on en avait évoqué quelques uns ici :
http://autoitscript.fr/forum/viewtopic. ... exp#p58323
après c'est une fois de plus notre ami Google, et enfin après chacun a sa façon de les exploiter
Je vais tenter une explication d'explication (prenez au préalable 1000mg de paracétamol avant de lire la suite):
on veut localiser un début de bloc commençant par "01". Ce bloc peut être en début de fichier ou au milieu. Ceci ve dire que devant le 01 on a peut être un retours chariot ou pas. Pour le retours chariot on peut le coder en regexp par \x0d\x0a (cad \r\n ou CRLF). Pour le peut "être" on utilise le "?".
Donc \x0d?\x0a?01 ça va matcher 01 en début de fichier ou précéder d'un retours chariot
on va commencer à récapituler la pattern petit à petit, donc là on en est à
\x0d?\x0a?01
Maintenant on veut s'assurer que la sous chaîne 09875 apparaisse derrière se 01, mais avec entre les deux n'importe quoi. Le n'importe quoi c'est le "." (sauf les retours chariots) et comme il y en a plusieurs des caractères comme ça, on utilise "+" pour préciser cette répétition.
récapitulatif : \x0d?\x0a?01.+09875
Maintenant faut terminer d'aller au bout de la ligne, car ici on est juste derrière 09875 . On va donc tout sélectionner jusqu'au prochain retours chariot : .+\x0d?\x0a? (on rappelle que "." c'est tout sauf retours chariot "+" c'est plusieurs, \x0d? (CR ou pas) \x0a(LF ou pas) ) . Pour quoi les "ou pas" ici ? Et bien c'est pour anticiper le fait qu'un retours chariot peut s'écrire @CRLF en format DOS, @CR en format MAC et @LF en Unix et donc on se prémuni des éventuelle soucis d'import exotiques de fichier.
Et donc en récap :
\x0d?\x0a?01.+09875.+\x0d?\x0a? <== ça c'est la première ligne du bloc (prenez un 2eme comprimé si nécessaire)
Maintenant on doit tout prendre (y compris les retours chariots jusqu'à la dernière occurrence de 09875)
En théorie j'aurai dit que [.\x0d\x0a]+ aurait fait l'affaire. Mais en pratique ça ne marche pas
et bien solution de repli, je tape dans les jeux de caractères standard (là je fais mon flémard je copie colle des morceau d'aide) :
\w Match any "word" character: a-z, A-Z, 0-9 or underscore (_).
\d Match any digit (0-9) (Ah bah c'est redondant avec \w donc on peut laisser tomber
)
\s Match any whitespace character: Chr(9) through Chr(13) which are Horizontal Tab, Line Feed, Vertical Tab, Form Feed, and Carriage Return, and the standard space ( Chr(32) ). (du coups on pourrait se passer de \x0d et \x0a mais bon ...)
d'où la formule lourde [\w\d\s\x0a\x0d]+ Les [] c'est pour dire qu'on définit on ensemble de caractères possibles.
Après rédaction de ces explication je viens de tester du coups cette expression plus simple :
[\w\W]+
Et là on a bien l'ensemble des caractères car \W est le complémentaire de \w Donc si vous permettez nous allons continuer avec cette dernière.
\x0d?\x0a?01.+09875.+\x0d?\x0a?[\w\W]+
Si on s'arrête ici alors on à sélectionné tout le reste du fichier.
Il faut alors lui dire de s'arrêter sur la dernière pattern 09875 qui est précédé et suivi de n'importe quoi :
.+09875.+
et on récupère le dernier retours chariot avec l'astuce du "?" pour les différents type d'encodage : \x0d?\x0a?
et on a
\x0d?\x0a?01.+09875.+\x0d?\x0a?[\w\W]+.+09875.+\x0d?\x0a?
que je recolorise maintenant comme mon dernier poste histoire de refaire l'analogie:
\x0d?\x0a?01.+09875.+\x0d?\x0a?[\w\W]+.+09875.+\x0d?\x0a?
http://autoitscript.fr/forum/viewtopic. ... exp#p58323
après c'est une fois de plus notre ami Google, et enfin après chacun a sa façon de les exploiter
Je vais tenter une explication d'explication (prenez au préalable 1000mg de paracétamol avant de lire la suite):
on veut localiser un début de bloc commençant par "01". Ce bloc peut être en début de fichier ou au milieu. Ceci ve dire que devant le 01 on a peut être un retours chariot ou pas. Pour le retours chariot on peut le coder en regexp par \x0d\x0a (cad \r\n ou CRLF). Pour le peut "être" on utilise le "?".
Donc \x0d?\x0a?01 ça va matcher 01 en début de fichier ou précéder d'un retours chariot
on va commencer à récapituler la pattern petit à petit, donc là on en est à
\x0d?\x0a?01
Maintenant on veut s'assurer que la sous chaîne 09875 apparaisse derrière se 01, mais avec entre les deux n'importe quoi. Le n'importe quoi c'est le "." (sauf les retours chariots) et comme il y en a plusieurs des caractères comme ça, on utilise "+" pour préciser cette répétition.
récapitulatif : \x0d?\x0a?01.+09875
Maintenant faut terminer d'aller au bout de la ligne, car ici on est juste derrière 09875 . On va donc tout sélectionner jusqu'au prochain retours chariot : .+\x0d?\x0a? (on rappelle que "." c'est tout sauf retours chariot "+" c'est plusieurs, \x0d? (CR ou pas) \x0a(LF ou pas) ) . Pour quoi les "ou pas" ici ? Et bien c'est pour anticiper le fait qu'un retours chariot peut s'écrire @CRLF en format DOS, @CR en format MAC et @LF en Unix et donc on se prémuni des éventuelle soucis d'import exotiques de fichier.
Et donc en récap :
\x0d?\x0a?01.+09875.+\x0d?\x0a? <== ça c'est la première ligne du bloc (prenez un 2eme comprimé si nécessaire)
Maintenant on doit tout prendre (y compris les retours chariots jusqu'à la dernière occurrence de 09875)
En théorie j'aurai dit que [.\x0d\x0a]+ aurait fait l'affaire. Mais en pratique ça ne marche pas
\w Match any "word" character: a-z, A-Z, 0-9 or underscore (_).
\d Match any digit (0-9) (Ah bah c'est redondant avec \w donc on peut laisser tomber
\s Match any whitespace character: Chr(9) through Chr(13) which are Horizontal Tab, Line Feed, Vertical Tab, Form Feed, and Carriage Return, and the standard space ( Chr(32) ). (du coups on pourrait se passer de \x0d et \x0a mais bon ...)
d'où la formule lourde [\w\d\s\x0a\x0d]+ Les [] c'est pour dire qu'on définit on ensemble de caractères possibles.
Après rédaction de ces explication je viens de tester du coups cette expression plus simple :
[\w\W]+
Et là on a bien l'ensemble des caractères car \W est le complémentaire de \w Donc si vous permettez nous allons continuer avec cette dernière.
\x0d?\x0a?01.+09875.+\x0d?\x0a?[\w\W]+
Si on s'arrête ici alors on à sélectionné tout le reste du fichier.
Il faut alors lui dire de s'arrêter sur la dernière pattern 09875 qui est précédé et suivi de n'importe quoi :
.+09875.+
et on récupère le dernier retours chariot avec l'astuce du "?" pour les différents type d'encodage : \x0d?\x0a?
et on a
\x0d?\x0a?01.+09875.+\x0d?\x0a?[\w\W]+.+09875.+\x0d?\x0a?
que je recolorise maintenant comme mon dernier poste histoire de refaire l'analogie:
\x0d?\x0a?01.+09875.+\x0d?\x0a?[\w\W]+.+09875.+\x0d?\x0a?
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
- zeshrek
- Niveau 10

- Messages : 984
- Enregistré le : mer. 17 nov. 2010 09:31
- Localisation : Sur ma chaise
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
Sylvanie, je suis bluffé.
Pour la premiere fois j'ai réussi a suivre au moins une partie d'explication sur une regexp.
En fait j'ai tenu bon jusqu'au moment ou tu dis de prendre un 2eme comprimé. Jusque là, c'est clair. Apres, ma perplexité est revenue, avec un gros point d'interrogation.
Il va vraiment falloir que je me mette a lire serieusement des trucs sur la syntaxe des regexp. Mis bon sang, que ca a l'air indigeste !
Pour la premiere fois j'ai réussi a suivre au moins une partie d'explication sur une regexp.
En fait j'ai tenu bon jusqu'au moment ou tu dis de prendre un 2eme comprimé. Jusque là, c'est clair. Apres, ma perplexité est revenue, avec un gros point d'interrogation.
Il va vraiment falloir que je me mette a lire serieusement des trucs sur la syntaxe des regexp. Mis bon sang, que ca a l'air indigeste !
Si vis pacem para bellum
- sylvanie
- Niveau 11

- Messages : 1556
- Enregistré le : jeu. 26 juil. 2007 21:31
- Localisation : Paris
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
Bah c'est déjà ça !
Bon l'exemple n'est pas bon pour commencer, car là on est dans un cas très tourdu. Les sélection de blocs avec retours chariot c'est toujours un peu pénible. Courage !
Bon l'exemple n'est pas bon pour commencer, car là on est dans un cas très tourdu. Les sélection de blocs avec retours chariot c'est toujours un peu pénible. Courage !
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
- Tlem
- Site Admin

- Messages : 11830
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Supression de lignes dans fichier TXT
J'admire, car perso, je me suis arrêté à : 
prenez au préalable 1000mg de paracétamol avant de lire la suite
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é".

