[Perl] Saut de ligne + extraction fichiers

Résolu/Fermé
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007 - 5 avril 2007 à 18:40
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 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...
A voir également:

11 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
5 avril 2007 à 19:20
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.
0
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
5 avril 2007 à 20:58
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
0
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007
5 avril 2007 à 21:06
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.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
5 avril 2007 à 21:18
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007
5 avril 2007 à 21:26
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...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
5 avril 2007 à 21:30
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
0
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007
5 avril 2007 à 21:41
Merci beaucoup, c'est très sympa de ta part, je vais de ce pas préparer le mail...

A+
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
5 avril 2007 à 22:37
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__

0
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007
6 avril 2007 à 08:28
Je vais, moi aussi, le tester... En attendant merci beaucoup.
0
loulou06 Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 9 avril 2007
9 avril 2007 à 18:40
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+
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 avril 2007 à 18:43
De rien :-)
0