Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2292 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Triturage de fichier en PERL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Triturage de fichier en PERL

n°1209975
katak
Posté le 28-09-2005 à 16:03:21  profilanswer
 

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:

mood
Publicité
Posté le 28-09-2005 à 16:03:21  profilanswer
 

n°1209984
Elmoricq
Modérateur
Posté le 28-09-2005 à 16:09:23  profilanswer
 

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  

n°1210006
katak
Posté le 28-09-2005 à 16:26:19  profilanswer
 

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

n°1210014
Taz
bisounours-codeur
Posté le 28-09-2005 à 16:28:08  profilanswer
 

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

n°1210030
Elmoricq
Modérateur
Posté le 28-09-2005 à 16:42:32  profilanswer
 

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]

n°1210058
katak
Posté le 28-09-2005 à 17:02:32  profilanswer
 

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
n°1210076
Elmoricq
Modérateur
Posté le 28-09-2005 à 17:17:07  profilanswer
 

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
n°1210083
katak
Posté le 28-09-2005 à 17:19:50  profilanswer
 

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

n°1210103
katak
Posté le 28-09-2005 à 17:38:55  profilanswer
 

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;
}}

n°1210108
Elmoricq
Modérateur
Posté le 28-09-2005 à 17:43:50  profilanswer
 

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é.
 
:/

mood
Publicité
Posté le 28-09-2005 à 17:43:50  profilanswer
 

n°1210114
Taz
bisounours-codeur
Posté le 28-09-2005 à 17:55:15  profilanswer
 

`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 ...

n°1210119
Elmoricq
Modérateur
Posté le 28-09-2005 à 18:00:28  profilanswer
 

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
n°1210149
katak
Posté le 28-09-2005 à 18:26:55  profilanswer
 

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:

n°1232955
Elmoricq
Modérateur
Posté le 27-10-2005 à 20:49:13  profilanswer
 

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ù ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Triturage de fichier en PERL

 

Sujets relatifs
remplacer une chaine de caractere dans un fichier en .batVB Excel - Renommer fichier en fonction du répertoire
fichier matlab?[Question] - Comment lancer un script perl en tache de fond
mise en forme d'un fichier xls à partir de vb dans accesouvrir un fichier protégé via Http avec une fonction PHP
Plusieurs pieds de page dans un seul fichier htmlObtenir la date d'un fichier sans la bibliothèque usuelle
Fichier joint, par mail()probleme d ecriture dans un fichier
Plus de sujets relatifs à : Triturage de fichier en PERL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR