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 un fichier


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut Trier un fichier
    Bonjour à tous,

    Je veux trier un fichier suivant deux colonnes, voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    4;00:00
    1;00:00
    6;00:00
    4;01:00
    1;01:00
    6;01:00
    4;23:00
    1;23:00
    6;23:00
    Le résultat recherché est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    1;00:00
    1;01:00
    1;23:00
    4;00:00
    4;01:00
    4;23:00
    6;00:00
    6;01:00
    6;23:00
    Voici mon code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    #!/usr/bin/perl
     
    use strict;
    my %count;
    my $i;
    open my $filehandler, '<', 'Input.csv'
    or die "$!\n";
    while (<$filehandler>) {
        chomp($_);
     
        my @ligne=split(";",$_);
        $i=$ligne[4];
     
        $count {"$ligne[1].$ligne[4]"} =$_;
        print("$ligne[1] $ligne[4]\n");
      }
    close $filehandler;
     
    open $filehandler, '>', 'Output.csv'
    or die "$!\n";
     
    print $filehandler map { "$count{$_}\n" } sort { $a <=> $b } keys %count;
     
    close $filehandler;
    Généralement, je ne trouve pas le même nombre de lignes dans les deux fichiers, alors que normalement oui . Je ne sais pas si mon code est juste.

    Merci de m'aider.

    Salutations.

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    http://articles.mongueurs.net/magazines/linuxmag48.html

    peut-être avec une transformation Schwartzienne, effectuer le tri sur la première partie de la ligne et ensuite sur la seconde.
    -- Jasmine --

  3. #3
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Dans l'esprit du conseil de Jasmine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/env perl
    use strict; use warnings;
     
    my %lines;
    while (<>) {	
    	my @fields = split ';';
    	$lines{$_} = [ $fields[0], $fields[1] ];
    }
    print sort { $lines{$a}->[0] <=> $lines{$b}->[0] }
    		sort { $lines{$a}->[1] cmp $lines{$b}->[1] }
    			keys %lines;
    Pour le 2ème critère, il est judicieux à mon avis d'utiliser la comparaison de chaîne (cela évite de décomposer les deux sous-champs).

    Demande ce que tu ne comprends pas. (J'ai utilisé un hash de tableau à deux entrées).

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    script de Jedai

    Adapté à ton cas :
    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
    18
    19
    20
    21
    #!/usr/local/bin/perl
     
    use warnings;
    use strict;
     
     
    open my $filehandler, '<', "data.txt" or die $!;
    my @list = <$filehandler>;
    close $filehandler;
     
     
     
     
    my @sorted_list =
      map { $_->[2] }
        sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] }
          map { m/^(\d+);(\d+):\d+$/; [ $1, $2, $_ ] }
            @list;
     
     
    map {print "$_\n"} @sorted_list;
    -- Jasmine --

  5. #5
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Petite correction (grâce à Jedaï et Jasmine)) sur le code que je t'ai montré : il vaut mieux bien sûr éviter les deux sort et remplacer par un ||. Autant pour moi, j'ai tapé un peu trop vite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my %lines;
    while (<>) {	
    	my @fields = split ';';
    	$lines{$_} = [ $fields[0], $fields[1] ];
    }
    print sort { $lines{$a}->[0] <=> $lines{$b}->[0] 
    		|| $lines{$a}->[1] cmp $lines{$b}->[1] }
    			keys %lines;

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut
    Bonsoir,

    Merci de m'avoir aidé, maintenant tout marche comme sur des roulettes .

    Merci Iblis et Jasmine80 .

    Salutations.

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    N'hésite pas à poser des questions sur ce que tu ne comprends pas.
    -- Jasmine --

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier un fichier
    Par Premium dans le forum C
    Réponses: 12
    Dernier message: 23/01/2006, 09h12
  2. trier des fichiers avec un tableau flexgrid
    Par digger dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/12/2005, 15h20
  3. Trier un fichier
    Par enicnath dans le forum Général Python
    Réponses: 5
    Dernier message: 10/11/2005, 17h31
  4. [XSLT] - Trier un fichier sur plusieurs critères
    Par ytse dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 16h26
  5. Trier les fichiers par type et les afficher par groupe ...
    Par KneXtasY dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 18/09/2005, 18h50

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