Rechercher : dans
Par :

Perl - Ecrire dans un fichier

Dernière réponse le 25 déc 2007 à 22:28:25 artagon7, le 25 déc 2007 à 21:12:35 
 Signaler ce message aux modérateurs

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,

Configuration: Linux
Konqueror 3.5

Meilleures réponses pour « Perl Ecrire dans un fichier » dans :
Perl - Les fichiers Voir La notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
[MS-Dos] Ecrire dans un fichier texte en batch VoirPour écrire dans un fichier texte, il suffit d'utiliser une redirection ">" : echo texte_à_ecrire > fichier_de_sortie.txt Pour écrire à la fin d'un texte existant (concaténation) : echo "écriture a la fin du fichier ">>...
Clé USB verrouillée - Impossible d'écrire VoirS'il vous est impossible d'écrire ou d'enregistrer des fichiers sur votre clé USB, celle-ci est probablement verrouillée en lecture seule. Verrou de lecture seule Dans un premier temps, vérifier que la clé USB ne possède pas de loquet (petit...
[PHP] Upload de fichiers VoirLe langage PHP permet de gérer des fichiers envoyés (uploadés) grâce à un formulaire HTML. Formulaire d'envoi de fichiers Configuration de PHP pour permettre l'upload Récupération du fichier avec PHP Formulaire d'envoi de fichiers La...

1

lami20j, le 25 déc 2007 à 21:38:39

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


lami20j
Joyeux Noël à tou(te)s

Répondre à lami20j

2

lami20j, le 25 déc 2007 à 21:42:06

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;

lami20j
Joyeux Noël à tou(te)s

Répondre à lami20j

3

 artagon7, le 25 déc 2007 à 22:28:25

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.

Répondre à artagon7