[Perl] Saut de ligne + extraction fichiers
Résolu
loulou06
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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...
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...
A voir également:
- [Perl] Saut de ligne + extraction fichiers
- Partage de photos en ligne - Guide
- Comment supprimer une page sur word avec un saut de page ? - Guide
- Mètre en ligne - Guide
- Explorateur de fichiers - Guide
- Renommer des fichiers en masse - Guide
11 réponses
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.
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.
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
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
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.
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.
alors c'est comme ça
Tu peux afficher ton script ici.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...
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...
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
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
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
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__
<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