no save
Assistance
Achat
News

Forum | Linux/Unix
[PERL] Extraire des donnees d'un fichier.
lami20j, le mer. 20 sept. 2006 à 12:01:06
Salut,

c'est bien que tu cherches par toi même.
En revanche si je peux me permettre quelques conseils ;)

Ce n'est pas une bonne idée de stocker le fichiers dans un tableau et ensuite traiter le tableau.
Enfin ça marche pour les petits fichiers, mais si tu as un grand fichier tu n'arriveras pas et si tu arrives il y a un prix à payer (la mémoire)

J'ai fait un test sur un fichier de 840 Mo avec presque 17 millions lignes et ton code génére le message Out of memory.

J'ai testé aussi ton bout de code sans essayer de le comprendre, sur le fichier et le résultat ce n'est pas ce que tu demandes.

Voilà mon test (j'utilise 2 fichiers temporaires que je supprime après traitement,. ce n'est pas la meilleure méthode, j'ai fait vite fait hier soir).
Ce soir je vais expliquer mon code et je vais te donner aussi quelques conseils concernant Perl, vu qu'il peut être comparé à kanji ;)

La taille et le nombre de ligne du fichier et le temps d'exécution
lami20j@debian:~/trash$ cat leo25.txt | wc -l
16786176
lami20j@debian:~/trash$ du -h leo25.txt
843M leo25.txt

lami20j@debian:~/trash$ time perl ccm_19092006.pl

real 5m0.220s
user 3m46.298s
sys 0m15.441s
lami20j@debian:~/trash$
Le script #!/usr/bin/perl

open F_FILE,"leo25.txt" or die "E/S : $!";
open TEMP,">temp" or die "E/S : $!\n";

open LIRE,"temp" or die "E/S :$!\n";
open RES, ">res_leo" or die "E/S : $!\n";

open RES_LIRE, "res_leo" or die "E/S : $!\n";
open RES_ECRIRE,">final_res" or die "E/S : $!\n";

while( <F_FILE> ) {
s/\r\n/ / if /noeuds/i;
s/^\s*//;
print TEMP $_;
}

while (<LIRE>) {
next unless /element\b|noeuds/i;
s/\s+/ /g if /noeuds/i;
print RES " $1\n" if /noeuds.*:\s+(.*)/i;
my $idx = $1 if /S-D.*?(\d+)/;
print RES "$idx";
}

while (<RES_LIRE>) {
s/(\d+)\s+(.*)/$2 $1/;
print RES_ECRIRE $_;
}

unlink("temp");
unlink("res_leo"); Le résultat est dans le fichier final_res dans le répertoire courant.

lami20j
Précédentleo25
sept. 06
leo25
sept. 06
Suivant
REPONSES
lami20j
sept. 06
leo25
sept. 06
lami20j
sept. 06
leo25
sept. 06
leo25
sept. 06
lami20j
sept. 06
leo25
sept. 06
lami20j
sept. 06
leo25
sept. 06
Version Web
Réalisé par RedShift
no save