Un moyen de supprimer les lignes d'un texte

Un moyen de supprimer les lignes d'un texte - Divers - Programmation

Marsh Posté le 28-02-2018 à 13:57:01    

qui contiennent des lettres prédéfinies peu importe l'ordre ?

 

Exemple un fichier notepad avec :

 

abcaa
bbcab
cbaccc
kikiee
oiokil

 

je veut que le script supprime automatiquement toutes les lignes qui ont "abc", soit en l'occurence les 3 premières. Merci   :bounce:


Message édité par satoshi2 le 28-02-2018 à 13:59:36
Reply

Marsh Posté le 28-02-2018 à 13:57:01   

Reply

Marsh Posté le 28-02-2018 à 14:03:54    

Lu,
 
euh, dans quel langage ? Tu as fait quoi ?
 
a ou b ou c : grep -ve a -e b -e c mon_fichier ?


Message édité par pluj le 28-02-2018 à 14:06:55
Reply

Marsh Posté le 28-02-2018 à 14:06:34    

Peu importe le language.

 

Juste par exemple un script qui dirait

 

"supprimer toutes les lignes qui contiennent a,b,c" dans un fichier texte

 

et sur windows, surtout

 

par exemple abced est supprimé, mais abede est gardé.


Message édité par satoshi2 le 28-02-2018 à 14:08:35
Reply

Marsh Posté le 28-02-2018 à 14:13:15    

En PHP, c'est facile, si le fichier n'est pas trop long :
 

Code :
  1. <?php
  2. const FICHIER = '/tmp/mon_fichier';
  3.  
  4. file_put_contents(
  5.    FICHIER,
  6.    implode(
  7.        '',
  8.        array_filter(
  9.            file(FICHIER),
  10.            function ($v) {
  11.                return FALSE === strpos($v, 'a') || FALSE === strpos($v, 'b') || FALSE === strpos($v, 'c');
  12.            }
  13.        )
  14.    )
  15. );


Message édité par pluj le 28-02-2018 à 14:18:05
Reply

Marsh Posté le 28-02-2018 à 14:13:45    

et si il est trop long ? ça crash c'est ça ?

Reply

Marsh Posté le 28-02-2018 à 14:16:29    

Choisis ton langage (C/C++, java, PHP/Perl, Powershell, Autoit...) et écris un bout de code puis reviens ici si tu as des questions ou que tu rencontre des pbs. Mais on ne te le fera pas ce script. :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-02-2018 à 14:21:51    

Citation :

et si il est trop long ? ça crash c'est ça ?


Le contenu du fichier est intégralement mis en mémoire, donc, c'est possible. Du moins, ce n'est pas idéal pour un fichier volumineux.
 
Sinon il faut lire le fichier ligne par ligne (fgets) pour réécrire les lignes qui ne contiennent ni a ni b ni c dans un fichier temporaire avant de remplacer le fichier original par ce dernier.


Message édité par pluj le 28-02-2018 à 14:22:18
Reply

Marsh Posté le 28-02-2018 à 14:26:28    

"Sinon il faut lire le fichier ligne par ligne (fgets) pour réécrire les lignes qui ne contiennent ni a ni b ni c dans un fichier temporaire avant de remplacer le fichier original par ce dernier."
 
 
et par exemple en autoit ça serait en gros quoi comme fonctions ?

Reply

Marsh Posté le 28-02-2018 à 14:33:06    

ça à l'air extrêmement dur ça, je suppose que ça fait intervenir des array ?

Reply

Marsh Posté le 28-02-2018 à 14:33:16    

Citation :

et par exemple en autoit ça serait en gros quoi comme fonctions ?


 
Avant c'était n'importe quel langage et maintenant tu précises autoit.
 
Bref, je ne connais pas et à toi de chercher aussi ...
 

Citation :

ça à l'air extrêmement dur ça, je suppose que ça fait intervenir des array ?


La solution PHP ci-dessus, oui. Une bête lecture ligne par ligne, non.


Message édité par pluj le 28-02-2018 à 14:34:25
Reply

Marsh Posté le 28-02-2018 à 14:33:16   

Reply

Marsh Posté le 28-02-2018 à 14:43:41    

Je précise autoit car je connais un peu. Mais au pire n'importe quel langage c'est bon.

 

Le truc que j'arrive pas c'est de déterminer si dans une ligne d'un .txt, 2-3 lettres sont présentes.

 

Si quelqu'un sait, même en php ou autre ça serait cool.

 

Après c'est possible pour moi de raccorder avec un script autoit qui fera le taff de supprimer ou de créer un nouveau fichier sans les dit-lignes qui font tâche.

 
Spoiler :

http://www.pattesetmoustaches.com/wp-content/uploads/2016/06/photo-petit-chaton-mignon.jpg


Message édité par satoshi2 le 28-02-2018 à 15:14:26
Reply

Marsh Posté le 28-02-2018 à 15:31:04    

"Expression régulière"


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 28-02-2018 à 15:52:14    

Peu importe le langage, écris l'algo en pseudo-code. Une fois fait, t'as plus qu'à prendre la doc du langage et d'aller dans les sections "fichiers" et "chaînes de caractères" pour trouver les fonctions qui permettent d'ouvrir et fermer un fichier, de lire une ligne, d'écrire une ligne puis la fonction qui permet de faire soit un regexp soit une recherche de sous-chaîne dans une chaîne.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-02-2018 à 16:14:24    

Citation :

Si quelqu'un sait, même en php ou autre ça serait cool.


 
Ce n'est pas comme si le code que j'ai donné ne comportait pas la solution (strpos) ...

Reply

Marsh Posté le 28-02-2018 à 17:13:52    

satoshi2, il va falloir te prendre en main un peu car on ne va pas te faire tout le boulot à ta place, cf les règles [0C] et [0D] de ce forum :o
pluj a déjà fait une bonne partie du code...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-03-2018 à 11:05:01    

L'énoncé n'est pas suffisamment précis.  
 - est ce qu'il faut supprimer uniquement s'il y a au moins les 3 ?  
 - est ce que les 3 doivent être continus ? Par exemple bacaaaa ca marche mais bkcaaaa  , ca ne marche pas pas
- est ce bien le triplé 'abc' ( peu importe l'ordre ) qui importe, ou bien une  fois qu'on le rencontre, on supprime tous les autres occurrences :  
     * abcbcakk donne bcakk ou kk ? ( on supprime toutes les occurrences de 'abc' peu importe l'ordre )
     * abcakk donne akk ou kk ?  ( on a rencontré une fois 'abc' peu importe l'ordre, on supprime tous les a , b et c )
 - est ce que l'occurrence rencontrée peut se trouver en n'importe quelle position ou doit-elle être en début de ligne ?

 
Edit : j'avais pas vu qu'il fallait supprimer toute la ligne :o
 
 
En shell script ( avec sed)  c'est assez simple, avec PERL aussi, sinon python.
 
edit2 : avec sed  
 

Code :
  1. sed -i '/\(abc\)\|\(acb\)\|\(bac\)\|\(bca\)\|\(cba\)\|\(cab\)/d' monfichier.txt


Message édité par xilebo le 01-03-2018 à 11:45:15
Reply

Marsh Posté le 02-03-2018 à 11:20:09    

Oui j'ai finalement trouvé, merci beaucoup.

 

Il me manque juste un truc :

 

Comment faire pour supprimer une colonne entière d'un fichier texte ? Si la longueur est trop importante pour sélectionner manuellement bien sûre. Donc avec un petit script ou logiciel externe. Y a pas de "/" qui sépare les colonnes dont excel ne marchera pas.

 

L'idée c'est de passer de :

 

aaab
aaab
aaab

 

à

 

aaa
aaa
aaa

 


merci


Message édité par satoshi2 le 02-03-2018 à 11:23:13
Reply

Marsh Posté le 02-03-2018 à 11:22:32    

la notion de colonne n'existe pas dans un fichier texte.
 
Cependant, si la largeur et la position de ta colonne sont fixes , tu peux te dire que le début de la colonne c'est n caractères après le caractère \n , et la largeur valant m , tu effaces donc les caractères entre n et n + m - 1 pour chaque ligne ( ne pas oublier de traiter la première ligne ).

Reply

Marsh Posté le 02-03-2018 à 11:34:19    

ou alors plutot supprimer une suite de lettres à chaque ligne, sachant que les colonnes sont les mêmes

 

exemple :

 

aaabbb
cccbbb
dddbbb

 

deviendrait :

 

aaa
ccc
ddd

 

ça m'irai car bbb est supprimé, et comme toutes les colonnes sont bbb, ça efface les colonnes


Message édité par satoshi2 le 02-03-2018 à 11:36:15
Reply

Marsh Posté le 02-03-2018 à 11:41:50    

avec sed, tu peux supprimer comme je te l'ai dit de la façon suivante :

 



filsif@sd-102108:~$ cat texte.txt
abdc111aaa
abed222a
accd433bkgfkfkek
aefd555
roez500eezek
filsif@sd-102108:~$ sed -r 's/^(.{4})(.{3})(.*)/\1\3/g' texte.txt
abdcaaa
abeda
accdbkgfkfkek
aefd
roezeezek
filsif@sd-102108:~$

 

edit : j'ai supprimé les caractères 4 à 7 de chaque ligne


Message édité par xilebo le 02-03-2018 à 11:42:40
Reply

Marsh Posté le 02-03-2018 à 11:46:06    

je vois que tu es sous windows, mais sed existe sous windows avec cygwin.
 
Sinon, tu peux faire la même chose avec  notepad++ en utilisant les macros vu que la taille est fixe.
 
Voici l'algo :
 
- tu ouvres ton fichier avec notepad++
- tu te mets au debut de ton fichier
- tu fais "start recording macro"
- tu fais 4 fois flèche droite ( dans mon exemple )
- tu fais 3 fois del
- tu fais retour début de la ligne
- tu fais flèche bas
- tu stoppes l'enregistrement de la macro
 
A partir de ce moment là, à partir du début de la 2eme ligne, tu peux jouer la macro en boucle jusque la fin de ton fichier.

Reply

Marsh Posté le 02-03-2018 à 14:20:24    

ok merci c'est fait

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed