Triturage de fichier en PERL

Triturage de fichier en PERL - Perl - Programmation

Marsh Posté le 28-09-2005 à 16:03:21    

Salut,
 
Voila je cherche a enlever une ligne bien precise dans un fichier que j'aurai cree:
 
J'ai un fichier qui s'apelle toto.txt et dedans il y a 1000 lignes, je veux effacer celle qui contient le mot sarkozy par exemple (oui j'aurais pu dire supprimer), quelle est la methode, j'arrive a ouvrir le fichier mais pas a effacer la ligne ou le mot y est.
 
 
Merci d'avance.
 
 :jap:

Reply

Marsh Posté le 28-09-2005 à 16:03:21   

Reply

Marsh Posté le 28-09-2005 à 16:09:23    

Tu dois ouvrir un fichier cible et y écrire toutes les lignes que tu lis de ton premier fichier, sans celles que tu souhaites enlever.
 
Tu ouvres un fichier en écriture avec :

open(FILE_OUT, ">nom_du_fichier" ) or die "Message : $!";


 
Quand tu as terminé, tu clos les deux fichiers, puis tu écrases l'ancien fichier avec le nouveau en utilisant :
rename ANCIEN_NOM, NOUVEAU_NOM  

Reply

Marsh Posté le 28-09-2005 à 16:26:19    

je suis ok, mais comment puis-je faire pour copier toutes les lignes sauf celle qui comporte "sarkozy" ? :)

Reply

Marsh Posté le 28-09-2005 à 16:28:08    

ben tu copie toutes les lignes sauf sarkozy
 
ou alors
 
grep -v sarko fichier

Reply

Marsh Posté le 28-09-2005 à 16:42:32    

katak a écrit :

je suis ok, mais comment puis-je faire pour copier toutes les lignes sauf celle qui comporte "sarkozy" ? :)


 
 
Poste ce que tu as déjà écrit comme code, pour qu'on voit où tu en es.
 
Surtout qu'il suffit de matcher le regexp "/sarkozy/i" soit ligne à ligne, soit avec un grep du tableau de chaînes représentant ton fichier dans son intégralité.
 
[:spamafote]

Reply

Marsh Posté le 28-09-2005 à 17:02:32    

Ben a la base je suis physicien et je dois faire un programme... alors comprenez mon incompetence!!! :D
Voila ce que j'ai fait:
 

chop($ls = `ls *4X_ML.jb`);
 
$temp = "ftp.cmd";
open(test,">$temp" );
open(JB,"$ls" );
 
while (<JB> )  
  {
    chomp;
     
      {
 
 
 if (/sarkozy/) {print test $temp;}
         
   
      }
  }
close (JB);
close (test);


 
Donc mon fichier que je veux ouvrir c'est *4X_ML.jb et je veux copier toutes les lignes sauf celle ou y'a "sarkozy".
 
Merci!!! :jap:


Message édité par katak le 28-09-2005 à 17:07:30
Reply

Marsh Posté le 28-09-2005 à 17:17:07    

Tu y étais presque, il te suffisait de remplacer "$temp" par "$_" et d'inverser la sélection dans ta ligne :

if (/sarkozy/) {print test $temp;}


 
Ce qui donne :

if (!/sarkozy/i) {print test $_;}


(le "i" après l'expression rationnelle, c'est pour ignorer les différences majuscule/minuscule).
 
 
Je te propose maintenant une manière plus propre d'effectuer ta tâche :
 

use strict;
 
# Récupération de la liste des fichiers à filtrer
opendir(DIRECTORY, "." ) or die "Echec ouverture du répertoire courant : $!";
my @files = grep /4X_ML.jb$/, readdir DIRECTORY;
closedir(DIRECTORY);
 
# Pour chaque fichier, filtrer les lignes contenant "sarkozy"
foreach my $file ( @files )
{
    open(IN, $file) or die "Echec ouverture du fichier $file : $!";
    open(OUT,">${file}.tmp" ) or die "Echec ouverture du fichier ${file}.tmp : $!";
     
    print OUT grep !/sarkozy/i, <IN>;
     
    close(IN);
    close(OUT);
     
    rename "${file}.tmp", $file;
}


Message édité par Elmoricq le 28-09-2005 à 17:20:42
Reply

Marsh Posté le 28-09-2005 à 17:19:50    

Ah ouais tu fais ca comme ca.... ben bravo!!! :jap:

Reply

Marsh Posté le 28-09-2005 à 17:38:55    

J'ai voulu creer un fichier avec des chiffres dedans et si un de ces chiffres se trouve dans mon fichier a tester alors on vire la ligne mais je ne sais pas comment utiliser une variable qui va pointer sur chaque nombre....
 

# Re'cupe'ration de la liste des fichiers a` filtrer
opendir(DIRECTORY, "." ) or die "Echec ouverture du re'pertoire courant : $!";
my @files = grep /4X_ML.jb$/, readdir DIRECTORY;
closedir(DIRECTORY);
opendir(DIRECTORY, "." ) or die "Echec ouverture du re'pertoire courant : $!";
my @files2 = grep /filetodelete.txt$/, readdir DIRECTORY;
closedir(DIRECTORY);
 
# Pour chaque fichier, filtrer les lignes contenant "sarkozy"
foreach my $file ( @files )
{
foreach my $file2 ( @files2 )
{    
    open(IN, $file) or die "Echec ouverture du fichier $file : $!";
    open(OUT,">${file}.tmp" ) or die "Echec ouverture du fichier ${file}.tmp : $!";
     
    print OUT grep !/$files2/i, <IN>;
    close(IN);
    close(OUT);
     
    rename "${file}.tmp", $file;
}}

Reply

Marsh Posté le 28-09-2005 à 17:43:50    

Je ne comprends ni ta question, ni la logique de ce que tu as voulu faire en triturant le bout de code que je t'ai donné.
 
:/

Reply

Marsh Posté le 28-09-2005 à 17:43:50   

Reply

Marsh Posté le 28-09-2005 à 17:55:15    

`ls *4X_ML.jb`
 
opendir(DIRECTORY, "." ) or die "Echec ouverture du re'pertoire courant : $!";
my @files = grep /4X_ML.jb$/, readdir DIRECTORY;
 
 
on voit les pros du perl ...
 
 
<*4X_ML.jb>
 
et c'est fait ...

Reply

Marsh Posté le 28-09-2005 à 18:00:28    

Taz a écrit :

<*4X_ML.jb>
 
et c'est fait ...


 
Ah c'est chouette ça, je ne connaissais pas ce raccourci.


Message édité par Elmoricq le 28-09-2005 à 18:00:53
Reply

Marsh Posté le 28-09-2005 à 18:26:55    

Elmoricq a écrit :

Je ne comprends ni ta question, ni la logique de ce que tu as voulu faire en triturant le bout de code que je t'ai donné.
 
:/


 
dans le fichier A j'ai des lignes qui comportent des numeros a deux chiffres, dans le fichier B j'ai une suite de numero (je l'organise comme je veux) a proscrire, donc je dois consulter B pour savoir ce que je dois enlever dans A. :)
 
merci Taz!!!  :hello:

Reply

Marsh Posté le 27-10-2005 à 20:49:13    

Taz a écrit :

<*4X_ML.jb>
 
et c'est fait ...


 
Bon, j'avais besoin d'un rapide script à appliquer sur près de 3000 fichiers d'un coup, j'ai utilisé cette syntaxe, et j'ai reçu une erreur type "glob failed ... " (faudrait que je retrouve l'erreur exacte, j'étais assez pressé au taf').
 
En passant par readdir(), plus de souci.
 
Une idée de la raison pour laquelle ça a raté ? Y a une limite quelque part, genre un 2048 qui traine je sais pas où ?

Reply

Sujets relatifs:

Leave a Replay

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