IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

trier le contenu d'un fichier


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut trier le contenu d'un fichier
    salut,

    J'aurai aimé savoir comment faire pour trier le contenu d'un fichier.
    Je sait qu'il existe la fonction sort, j'ai essayer de l'utiliser mais ça ne fonctionne pas;


    Merci

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Bonjour,

    Citation Envoyé par donny
    J'aurai aimé savoir comment faire pour trier le contenu d'un fichier.
    Je sait qu'il existe la fonction sort, j'ai essayer de l'utiliser mais ça ne fonctionne pas;
    Oui, il existe la fonction sort. Elle permet de trier tout et n'importe quoi de n'importe quelle manière.

    Si tu nous montre ce que tu as essayé, on pourra tenter de te corriger. Sinon, on va en être réduit à faire des suppositions inadaptées à ce que tu veux faire ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    dans mon script je me deplace dans le repertoire qui contient le fichier à trier.
    puis j'utilise le sort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chdir("/home/script/data.csv");
    sort data.csv;

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par donny
    dans mon script je me deplace dans le repertoire qui contient le fichier à trier.
    puis j'utilise le sort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chdir("/home/script/data.csv");
    sort data.csv;
    Je suis au regret de te dire que la démarche est simpliste et vouée à l'échec.

    D'abord, chdir dans un fichier NE PEUT PAS fonctionner.

    Ensuite, la fonction sort est destinée à trier une liste, c'est à dire un ensemble d'éléments chargés en mémoire.

    Dans ce cas précis, à part l'usage d'un éventuel module capable de lire un csv et de le trier, il va te falloir :
    • ouvrir le fichier .csv
    • le lire dans une liste
    • trier cette liste selon des critères de ton choix
    • sauver le résultat


    Bon courage.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    et s'il s'agit d'une simple liste dans le fichier,s'il contient des prenom par exemple :

    pierre
    paul
    ben
    tom

    est ce que je dois l'ouvrir aussi ?

  6. #6
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par donny
    et s'il s'agit d'une simple liste dans le fichier,s'il contient des prenom par exemple ...
    est ce que je dois l'ouvrir aussi ?
    Oui, si tu veux utiliser le tri interne de Perl, il faut charger cette liste en mémoire d'une façon ou d'une autre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open FIC, "<", "monfic.txt";
    @lignes = <FIC>;
    close FIC;
    @lignes_triees = sort { $a cmp $b } @lignes;
    Ce n'est pas testé, mais on ne doit pas être loin de la vérité.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut [perl] tri dans un fichier
    fichier text de base

    #x y
    1 5
    44 2
    3 74
    2 11

    fichier après modification

    #x y
    1 5
    2 11
    3 74
    44 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
          #! /usr/bin/perl
     
          use warnings;
          use strict;
     
          my %h = ();
          my $entete = <DATA>;
          while (<DATA>){
            next unless /^\d/;
            my($cle,$val) = split /\s+/,$_;
            $h{$cle} = $val;
          }
          print "$entete";
          foreach (sort {$a <=> $b} keys %h){
            print "$_ $h{$_}\n";
          }
    Exemple avec d'autre chiffre:

    X Y
    1 6

    3 22

    5 1

    0 8

    10 258

    2 5401
    ----------------------
    Résultat:

    X Y
    0 8
    1 6
    2 5401
    3 22
    5 1
    10 258

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    j'ai fait cela
    chdir("/home/test");
    my @ligne=();
    my @lignes_triees=();
    open (FIC, "<nom.csv");
    @ligne=print <FIC>;
    close FIC;
    my $lig;
    @lignes_triees = sort { $a cmp $b } @ligne;
    foreach $lig (@lignes_triees){
            print "$lig\n";
    }
    comme resultat j'ai 1 au lieu d'une liste de fichier trié

  9. #9
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    essaye
    @ligne=<FIC>; au lieu de @ligne=print <FIC>;

    ça devrait mieux marcher
    Si un ricard vaut un steak, j'ai bien bouffé une vache hier soir !
    L'art de poser les bonnes questions dans les forums afin de ne pas passer pour un

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open(DESCR,">nomsort.csv");
    my $lig;
    @lignes_triees = sort { $a cmp $b } @ligne;
    foreach $lig (@lignes_triees){
           print DESCR $lig;
    	#print "DESCR";
    }
    close(DESCR);
    exact c'etait cela
    et donc j'alimente en meme temps un autre fichier.
    une question pour comparé deux fichier
    je peux utiliser cmp ? ou <=> ?

  11. #11
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    cmp est l'opérateur de comparaison alphanumérique (chaines de caractères, mots ...)
    <=> est l'opérateur de comparaison numérique (nombres uniquement)

    Il faut donc choisir en fonction du type de données à trier.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  12. #12
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    donc deja dans mon script de tri
    faut que je modifie <=> par cmp car c'est du texte
    et si ensuite je veux comparer le fichier obtenu avec un autre fichier faut que j'utilise cmp car c'est du texte

  13. #13
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par donny
    et si ensuite je veux comparer le fichier obtenu avec un autre fichier faut que j'utilise cmp car c'est du texte
    Pour la comparaison entre deux fichiers, il y a plusieurs possibilités :
    • ouvrir les deux fichiers, et les lire tous les deux à la fois en faisant des tests cmp à chaque ligne ...
    • Utiliser un module dans le genre de Text:iff.
    • Faire un appel à une fonction système de comparaison, dans le genre diff sous unix, au risque de rendre le script non-portable.


    Il doit encore exister d'autres alternatives.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  14. #14
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    ok
    et pour lire deux fichier ligne à ligne et les comparé
    il faut que je les ouvre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $lign1;
    my $lign2;
    open (FIC1, "<un.csv");
    open(FIC2,"<deux.csv");
    $lign1 = <FIC1>
    $lign2= <FIC2>
    puis pour les comparer ligne à ligne, je dois faire une boucle ?
    il existerait pas quelquechose comme EOF ?

  15. #15
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Attention, il y a des erreurs de syntaxe dans l'ébauche de code que tu as donné (; en fin de ligne, par exemple).

    Citation Envoyé par donny
    puis pour les comparer ligne à ligne, je dois faire une boucle ?
    il existerait pas quelquechose comme EOF ?
    Oui, il faut faire une boucle. La lecture des lignes doit se trouver dans celle-ci.
    En guise de 'EOF', l'opérateur de lecture de fichier <> retourne faux lorsque l'on est en fin de fichier.

    Il y a deux lectures en parallèle, donc deux retours à tester ... la lecture parallèle/comparaison de fichiers est un problème classique d'algorithmique ... un cas d'école !
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  16. #16
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    probleme classique quand on connait le langage

  17. #17
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    il faut utiliser 2 boucle for imbriquer ?

  18. #18
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par donny
    probleme classique quand on connait le langage
    Citation Envoyé par 2Eurocents
    la lecture parallèle/comparaison de fichiers est un problème classique d'algorithmique ... un cas d'école !
    La programmation ne se limite pas à la maîtrise d'un langage.

    Il faut une seule boucle, genre while, mais dont la condition d'arrêt est la fin de l'un des deux fichiers, peu importe lequel.

    Il faut aussi pouvoir sortir de la boucle en cas de différence entre deux lignes.

    Il faut, enfin, pouvoir dire que les fichiers sont différents si tout ce qui a été comparé est identique, mais que l'un des deux se termine avant l'autre.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  19. #19
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    si le but est juste de vérifier que les 2 fichiers sont identique
    tu peux aussi comparer le résultat d'un calcul md5 ou sha sur tes 2 fichiers
    avec le module Digest::md5

    exemple de calcul pour 1 fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        use Digest::MD5;
        my $file = "toto.txt"
        open(FILE, $file) or die "Can't open '$file': $!";
        binmode(FILE);
        $file1_md5= Digest::MD5->new->addfile(*FILE)->hexdigest;
    Si un ricard vaut un steak, j'ai bien bouffé une vache hier soir !
    L'art de poser les bonnes questions dans les forums afin de ne pas passer pour un

Discussions similaires

  1. Trier le contenu d'un fichier
    Par wayat91 dans le forum VBScript
    Réponses: 2
    Dernier message: 22/12/2010, 11h40
  2. [Batch] Trier le contenu d'un fichier selon plusieurs critères
    Par ahu206 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 06/09/2010, 14h38
  3. [Batch] Trier le contenu d'un fichier
    Par Basis92 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 01/10/2009, 08h23
  4. Trier le contenu d'un fichier .csv
    Par KiraX10A dans le forum C++
    Réponses: 9
    Dernier message: 18/09/2009, 16h37
  5. Trier le contenu des fichiers en sortie
    Par hbellahc dans le forum kettle/PDI
    Réponses: 1
    Dernier message: 03/02/2009, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo