Perl - Ecrire dans un fichier

Résolu/Fermé
artagon7 Messages postés 415 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 11 février 2024 - 25 déc. 2007 à 21:12
artagon7 Messages postés 415 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 11 février 2024 - 25 déc. 2007 à 22:28
Bonjour,

Apres avoir lu le document perlintro, j'ai reussi a ecrire un programme en Perl qui reussi a trier les lignes contenues dans un fichier selon certains criteres et d'envoyer le resultat dans un autre fichier. Les lignes dans le fichier d'origine sont de la forme :

-rwxrwx--- 1 9200177 2007-12-08 17:37 e_can_lightfoot[1974]-if_you_could_read-[128].mp3
-rwxrwx--- 1 5445091 2007-12-08 17:37 e_can_streetheart[1900]-here_comes_the_night-[129].mp3


Il y a cependant un hic ... Lorsque Perl ecrit le resultat du tri dans le fichier de destination, le tri est bel et bien effectue mais il ecrit les resultats sur la meme ligne. Par exemple, dans le cas precedent, j'obtiens :

-rwxrwx--- 1 9200177 2007-12-08 17:37 e_can_lightfoot[1974]-if_you_could_read-[128].mp3-rwxrwx--- 1 5445091 2007-12-08 17:37 e_can_streetheart[1900]-here_comes_the_night-[129].mp3

Comment est-ce je que je pourrais obtenir un fichier comme l'original, i.e., avec saut de ligne?

Mon script est le suivant :

#!/usr/bin/perl

chdir ("/media/sda5/Informatique/Test");
open(OUTFILE, ">/media/sda5/Informatique/Test/contenu_musique_1.out") or die "Can't open file: $!";
open(INFILE, "contenu_musique.txt") or die "Can't open file: $!";

while(<INFILE>){
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
chomp;
push @nontrie,[$_,$2,$3,$4,$5,$6,$7];
}
@trie = map {$_->[0] }
sort {
$a->[6] <=> $b->[6]
||
$a->[5] cmp $b->[5]
} @nontrie;
print OUTFILE @trie;
close INFILE;


J'ai essaye successivement les lignes :

push @nontrie,[$_,$2,$3,$4,$5,$6,$7,'\n'];
push @nontrie,[$_,$2,$3,$4,$5,$6,$7,"\n"];

mais sans succes.

Merci,
A voir également:

3 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
25 déc. 2007 à 21:38
Salut,

voici quelques possibilités
print OUTFILE "$_\n" foreach @trie;
print OUTFILE "$_\n" for @trie;
print OUTFILE map { "$_\n"} @trie;
{
  local $"="\n";
  print OUTFILE "@trie\n";
}

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
25 déc. 2007 à 21:42
Ou tu simplement tu enlève le chomp
Je l'ai mis en commentaire (voir en gras)
#!/usr/bin/perl

chdir ("/media/sda5/Informatique/Test");
open(OUTFILE, ">/media/sda5/Informatique/Test/contenu_musique_1.out") or die "Can't open file: $!";
open(INFILE, "contenu_musique.txt") or die "Can't open file: $!";

while(<INFILE>){
  /^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
chomp;
  push @nontrie,[$_,$2,$3,$4,$5,$6,$7];
}

@trie = map  {$_->[0] }
        sort { $a->[6] <=> $b->[6]
                        ||
               $a->[5] cmp $b->[5]
             } @nontrie;

print OUTFILE @trie;
close INFILE;
close OUTFILE;
0
artagon7 Messages postés 415 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 11 février 2024 7
25 déc. 2007 à 22:28
Salut lami20j,

J'ai enleve la ligne chomp; la semaine derniere au cours de mes essais mais cela n'avait pas marche. Dans mon fichier de destination, il y avait parmi les 8 lignes que contient mon fichier deux lignes qui restaient toujours une a la suite de l'autre. J'avais abandonne cette facon.

Aujourd'hui, j'ai allume {toi, tu es paresseux ;-) moi je suis lent}. Je me suis apercu que le premier fichier implique parmi les deux correspondait a la derniere ligne de mon fichier source. Cette derniere ligne ne contenait pas de saut de ligne. J'ai donc ajoute un saut de ligne et tout est parfait. J'aurais du y penser avant... Je vais egalement garder les premieres suggestions que tu as emis au cas ou.

En ce qui concerne le tri de fichiers ca boucle la boucle. Ca devrait aller maintenant.

Donc, merci lami20j pour ton aide indispensable au cours de mon apprentissage de Perl concernant le tri de fichiers.
0