[..] Supression de lignes dans fichier TXT

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jujulips
Niveau 2
Niveau 2
Messages : 22
Enregistré le : ven. 11 mars 2011 21:20
Status : Hors ligne

[..] Supression de lignes dans fichier TXT

#1

Message par jujulips »

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 !! =)
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: Supression de lignes dans fichier TXT

#2

Message par DimVar »

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.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Supression de lignes dans fichier TXT

#3

Message par sylvanie »

jujulips a écrit : Est ce imaginable sans REGEXP ?
c'est pas punissable par la loi une telle remarque ? :mrgreen:
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
jujulips
Niveau 2
Niveau 2
Messages : 22
Enregistré le : ven. 11 mars 2011 21:20
Status : Hors ligne

Re: [..] Supression de lignes dans fichier TXT

#4

Message par jujulips »

sylvanie a écrit :
jujulips a écrit : Est ce imaginable sans REGEXP ?
c'est pas punissable par la loi une telle remarque ? :mrgreen:
Lol !! Je n'ai pas encore eu le temps de me mettre au chinois ... mais c'est précu =)
Avatar du membre
TT22
Membre émérite
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

#5

Message par TT22 »

Tien, c'est marrant parceque j'ai eu besoin exactement du même script ce matin, donc, le voici :
► Afficher le texte
Cordialement,
TT22
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Supression de lignes dans fichier TXT

#6

Message par sylvanie »

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)
► Afficher le texte
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
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
zeshrek
Niveau 10
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

#7

Message par zeshrek »

Tiens, je l'avais loupé celui là :
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?
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" ?
Si vis pacem para bellum
Avatar du membre
mikell
Spammer !
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

#8

Message par mikell »

zeshrek 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" ?
+1
" 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
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Supression de lignes dans fichier TXT

#9

Message par sylvanie »

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 :mrgreen: )
\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.
Avatar du membre
zeshrek
Niveau 10
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

#10

Message par zeshrek »

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 !
Si vis pacem para bellum
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Supression de lignes dans fichier TXT

#11

Message par sylvanie »

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 !
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Supression de lignes dans fichier TXT

#12

Message par Tlem »

J'admire, car perso, je me suis arrêté à :
prenez au préalable 1000mg de paracétamol avant de lire la suite
:lol:
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é".
Répondre