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

Signaler
Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007
-
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
-
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...

11 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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.
Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007

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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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
Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007

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.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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.
Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007

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...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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
Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007

Merci beaucoup, c'est très sympa de ta part, je vais de ce pas préparer le mail...

A+
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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__

Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007

Je vais, moi aussi, le tester... En attendant merci beaucoup.
Messages postés
7
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
9 avril 2007

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+
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
De rien :-)