Téléchargement
illégal
Posez votre question Signaler

[Perl] Saut de ligne + extraction fichiers [Résolu]

loulou06 7Messages postés 5 avril 2007Date d'inscription - Dernière réponse le 9 avril 2007 à 18:43
Bonjour,
J'ai besoin de faire une extraction de certaines lignes dans plusieurs fichiers (qui ont tous la même extension), j'ai déjà un petit script, mais je voudrais me débarrasser du caractère de saut de ligne qui ressort dans mon fichier résultat, l'autre problème est que je voudrais rendre cela sous forme "séparé par des virgules"...
Merci d'avance pour vos suggestions...
Lire la suite 

[Perl] Saut de ligne + extraction fichiers »

12 réponses
Réponse
+0
moins plus
Salut,

il faut dire un peu plus

l'extension ne compte pas trop
en revanche quelles lignes tu veux extraire?
pour supprimer le saut de ligne c'est bien de savoir la provenance de tes fichiers (win, mac, linux, unix, etc.)
pour séparer par des virgules tu n'as qu'à remplacer le séparateur actuel par virgule (à savoir aussi ce que veut tu faire quand la virgule existe déjà)

en bref un peu plus de détails
merci.
loulou06- 5 avril 2007 à 19:54
un extrait de fichier "type" il faut que je récupère les lignes 4, 7 et 13 en les "nettoyant" des caractères comme "[,(,/" etc. en début et en fin de ligne.

<TABLE>
<ROW>
<SITNAME>
CO_DB2_Appl_CatCache_Hit_Low
</SITNAME>
<TEXT>
<![CDATA[An application experiences low catalog cache hit ratio]]>
</TEXT>
<AFFINITIES>
00000000000000000000W0000000000000########F
</AFFINITIES>
<PDT>
<![CDATA[*IF *VALUE KUDDB2APPLGROUP00.cat_cache_hit_ratio *LT 50]]>
</PDT>

le caractère de saut de ligne est à la fin de la ligne 4 le fichier provient d'une base DB2 (à priori) sur un serveur W2003...

En ce qui concerne les virgules, au départ je n'en ai pas puisque ce sont des champs de tables, mais je voudrais en rajouter pour pouvoir traiter le fichier avec Excel par exemple... reste le problème des fichiers à stocker dans un seul fichier "résultat"...

Espérant que ces infos te serviront ?

Merci
Ajouter un commentaire
Réponse
+0
moins plus
tu ne m'aide pas trop :-)

tu parles de 4, 7 et 13
mais ça sera valable toujours ce critére?
je suppose que tes fichiers sont bien plus grands

par exemple dant ton cas je chosirais comme critére les lignes qui commencent avec CO et <![CDATA

voici un petit exemple qui n'est pas tout à fait la solution de ton problème, en plus ce n'est pas non plus la meilleure
lami20j@debian:~/trash$ cat ccm.pl
#!/usr/bin/perl
use warnings;
use strict;

while (<DATA>){
  next unless /CO|<!\[CDATA/;
  s/[\[<!>\]]//g;
  s/(cdata)/$1,/i;
  s/\s+/,/g;
  s/,$//;
  print;
}
print "\n";
__END__
<TABLE>
<ROW>
<SITNAME>
CO_DB2_Appl_CatCache_Hit_Low
</SITNAME>
<TEXT>
<![CDATA[An application experiences low catalog cache hit ratio]]>
</TEXT>
<AFFINITIES>
00000000000000000000W0000000000000########F
</AFFINITIES>
<PDT>
<![CDATA[*IF *VALUE KUDDB2APPLGROUP00.cat_cache_hit_ratio *LT 50]]>
</PDT>
lami20j@debian:~/trash$ perl ccm.pl
CO_DB2_Appl_CatCache_Hit_LowCDATA,An,application,experiences,low,catalog,cache,hit,ratioCDATA,*IF,*VALUE,KUDDB2APPLGROUP00.cat_cache_hit_ratio,*LT,50
--
lami20j
Ajouter un commentaire
Réponse
+0
moins plus
ok j'ai dû mal m'exprimer... en fait j'aurais besoin de CO_DB2_Appl_CatCache_Hit_Low ; An application experiences low catalog cache hit ratio ; *IF *VALUE KUDDB2APPLGROUP00.cat_cache_hit_ratio *LT 50 "saut de page"

j'ai un petit script qui fait à peu près ce que je veux, mais il n'est pas "fini"... est ce que je peux te l'envoyer ?

Merci.
Ajouter un commentaire
Réponse
+0
moins plus
alors c'est comme ça
lami20j@debian:~/trash$ cat ccm.pl
#!/usr/bin/perl
use warnings;use strict;

while (<DATA>){
  next unless /CO|<!\[CDATA/;
  s/[\[<!>\]]//g;
  s/cdata//i;
  s/\n/;/;
  print;
}
print "\n";
__END__
<TABLE>
<ROW>
<SITNAME>
CO_DB2_Appl_CatCache_Hit_Low
</SITNAME>
<TEXT>
<![CDATA[An application experiences low catalog cache hit ratio]]>
</TEXT>
<AFFINITIES>
00000000000000000000W0000000000000########F
</AFFINITIES>
<PDT>
<![CDATA[*IF *VALUE KUDDB2APPLGROUP00.cat_cache_hit_ratio *LT 50]]>
</PDT>
lami20j@debian:~/trash$ perl ccm.pl
CO_DB2_Appl_CatCache_Hit_Low;An application experiences low catalog cache hit ratio;*IF *VALUE KUDDB2APPLGROUP00.cat_cache_hit_ratio *LT 50;

Tu peux afficher ton script ici.
Ajouter un commentaire
Réponse
+0
moins plus
Je n'avais pas osé parce qu'il est un peu "bricolé"...


my @files = glob ("*.sit");
foreach $file (@files) {

open FICHIER,"< $file" or die "Aucun fichier !";
open WRITER,">> tmp.txt" or die "Le fichier ne peut être édité !\n";

$i=0;
$var=0;

while ($ligne = <FICHIER>)
{

if($i==3){
print WRITER $ligne ;
}

if($i==6){
if($ligne=~ /\<\!\[CDATA\[/){
if($'=~ /\]\]\>/){
print WRITER "$` \n";
}
}
}

if($i==12){
if($ligne=~ /\<\!\[CDATA\[/){
if($'=~ /\]\]\>/){
print WRITER "$` \n";
}
}

}
$i++;

}
}

close FICHIER;
close WRITER;

open FICHIER,"< tmp.txt" or die "Le fichier n'existe pas !";
open WRITER,"> resultat.txt" or die "Le fichier ne peut être édité !\n";

@lignes=<FICHIER>;
foreach $ligne (@lignes){
$res=chomp ($ligne);
print WRITER "$ligne ; ";
}

close FICHIER;
close WRITER;

le problème est que je n'arrive pas (avec ce script) à récupérer dans plusieurs fichiers la même combinaison de lignes, et à en faire une liste...
Ajouter un commentaire
Réponse
+0
moins plus
Je n'avais pas osé parce qu'il est un peu "bricolé"...
Oui, tu as raison :-D

Pour ne pas se compliquer la vie, voilà ce que je te propose
1. compresse tes fichiers (je vois que c'est l'extension .sit)
2. envoi le fichier compressé par mail (regarde mon profil)

je vais le traiter et je te l'enverrai

à vrai dire je n'ose pas bidouiller dans ton code, je vais écrire le mien
à toi de voir
Ajouter un commentaire
Réponse
+0
moins plus
Merci beaucoup, c'est très sympa de ta part, je vais de ce pas préparer le mail...

A+
Ajouter un commentaire
Réponse
+0
moins plus
Voici le script.
A savoir que je l'ai testé sur Linux.
J'ai remarqué que les fichiers ne coresspondent pas toujours (je parle du numéro de ligne)
Ex: regarde les fichiers
CO_MVS_Adress_Space_C012....
Peut être tu seras obligé de faire des petites modifications.
Je dois partir, mais à mon retour je vais le tester sous windows
#!/usr/bin/perl
use warnings;use strict;

my @sit = glob("*.sit");
open ECRIRE,">:crlf","resultat.txt"
   or die "E/S : $!\n";

foreach (@sit){
  open F_LIRE,"<:crlf","$_" or warn "E/S : $!\n";
  while (<F_LIRE>){
    next unless (4..4 or 7..7 or 13..13);
    s/[\[<!>\]\(\)]//g;
    s/cdata//i;
    s/\r?\n/;/;
    print ECRIRE;
  }
print ECRIRE "\n";
close F_LIRE;
}
close ECRIRE;
__END__

Ajouter un commentaire
Réponse
+0
moins plus
Je vais, moi aussi, le tester... En attendant merci beaucoup.
Ajouter un commentaire
Réponse
+0
moins plus
Effectivement cela fonctionne sous Windows.
J'ai vu, moi aussi, qu'il y avait des petites différences selon les fichiers, mais ce n'est pas grand chose...

Le fait est que c'est beaucoup plus "propre" que ce que j'avais fait et ça fonctionne mieux !!!

Merci beaucoup lami20j,

A+
Ajouter un commentaire
Réponse
+0
moins plus
De rien :-)
Ajouter un commentaire
Ce document intitulé « [Perl] Saut de ligne + extraction fichiers » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?