Perl - Ecrire dans un fichier [Résolu/Fermé]

Signaler
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
-
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
-
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,

3 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,

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";
}

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
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;
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
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.