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 :

Tri dans un fichier txt


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut Tri dans un fichier txt
    Salut c'est encore moi!!
    Désolé...

    Cette fois si ma demande change:
    Suite à mon prcécédent porblème (maintenant résolus),
    je souhaite réorganiser mes infos récupérées en trian par la date de la plus récente à la plus ancienne sauvegarde.

    Un exemple s'impose:

    bckad1lib1fr A Totale 01 fév 20:54
    bckad1lib1fr A Totale 08 fév 20:48
    bckad1lib1fr A Totale 15 fév 20:46
    bckad1lib1fr A Totale 22 fév 20:52
    bckad1lib1fr A Incr 04 fév 20:06
    bckad1lib1fr A Incr 05 fév 20:06
    bckad1lib1fr A Incr 06 fév 20:05
    bckad1lib1fr A Incr 07 fév 20:03
    bckad1lib1fr A Incr 11 fév 20:04
    bckad1lib1fr A Incr 12 fév 20:07
    bckad1lib1fr A Incr 13 fév 20:02
    bckad1lib1fr A Incr 14 fév 20:31
    bckad1lib1fr A Incr 18 fév 20:04
    bckad1lib1fr A Incr 19 fév 20:07
    bckad1lib1fr A Incr 20 fév 20:02
    bckad1lib1fr A Incr 21 fév 20:06
    bckad1lib1fr A Incr 25 fév 20:07
    bckad1lib1fr A Incr 26 fév 20:05
    bckad1lib1fr A Incr 27 fév 20:06
    bckad1lib1fr A Incr 28 fév 20:06
    bckad1lib1fr.st A Totale 02 fév 12:11
    bckad1lib1fr.st A Totale 04 fév 20:21
    bckad1lib1fr.st A Totale 05 fév 20:59
    bckad1lib1fr.st A Totale 06 fév 21:00
    bckad1lib1fr.st A Totale 07 fév 20:50
    bckad1lib1fr.st A Totale 09 fév 12:37
    bckad1lib1fr.st A Totale 11 fév 20:23
    bckad1lib1fr.st A Totale 12 fév 20:22
    bckad1lib1fr.st A Totale 13 fév 20:38
    bckad1lib1fr.st A Totale 14 fév 21:07
    bckad1lib1fr.st A Totale 18 fév 20:46
    bckad1lib1fr.st A Totale 19 fév 20:55
    bckad1lib1fr.st A Totale 20 fév 20:42

    Et ça continue comme sa longntemps...

    Je vous fais voir mon code tant que l'on y est, des suggestion...
    Mais je tiend à dire qu'il fonctionne le seul problème est le tri:
    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
    26
    27
    28
    29
    use warnings;
    use strict;
     
     
    # Variables.
    my $sauv = "Sauvegarde";
    my $syn = "Syn";
    my $fin = "Fin";
     
    # Ouverture du fichier cible.
    open (F, ' ..../tina.log');
     
    # Création du fichier pour reception de l'information.
    open (Fsor, '>..../Test.Tri.tina.txt');
     
     
     
    # Boucle m//.
    while (<F>){
    if ( /^Synthétique\s+(\X+)\s+(\w+)\s+\((\w+)\)\s+(\w+)\b/ ) {
            print Fsor $1 . ' ' . $2 . ' ' . $3 . ' ';
        }
    if ( /^Sauvegarde\s+(\X+)\s+(\w+)\s+\((\w+)\)\s+(\w+)\b/ ) {
            print Fsor $1 . ' ' . $2 . ' ' . $3 . ' ';
        }
    if ( /^Fin\s+:(.*)$/) {
            print Fsor $1 . "\n";
         }
    }
    J'ais aissayé avec sort mais le problème est je pense le format de la date, mais je ne peut pas le changer ...

    S'il vous manque des infos ou des précisions n'hésitez pas!

    je vous remercie d'avance!

  2. #2
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Il y a plusieurs manières de faire mais le plus évident, si ton fichier n'a pas un nombre trop grand de lignes, est d'utiliser un hash (pas du hash ! :mouarf:) :
    1. boucler sur les lignes
    2. extraire la date
    3. calculer le timestamp
    4. associer le timestamp (valeur) et la ligne (clé) dans le hash
    5. fin de boucle
    6. trier le hash sur les valeurs
    Pour extraire la date, si ton format est vraiment alien, tu peux le faire à la main avec un hash maison pour les noms de mois par exemple. Dans ton cas, Date::Parse devrait faire l'affaire pour parser la date française et calculer le timestamp.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Ok !
    Merci pour ta réponse je test et te met au courant!
    merci!!

  4. #4
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Conseils en vrac :

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Merci pour le conseil je vais en tenir compte !

    En se qui conserne Date::parse... je n'arrive pas à le trouver pour le
    télécharger... et je ne peut pas utiliser ppm puisque je suis au boulot donc ==> proxy...

    Je sais que google est mon amis mais là je crois qu'il ne l'est pas beaucoup...

    Si quelqu'un connais un lien ou je pourrais le prendre?!
    Sur CPAN il y a un descriptif mais pas de lien!

    Encore merci iblis

  6. #6
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Tu peux downloader le module sur la page du CPAN, voici le lien TimeDate-1.16.tar.gz

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Merci pour le lien !

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par kimous Voir le message
    Merci pour le conseil je vais en tenir compte !

    En se qui conserne Date::parse... je n'arrive pas à le trouver pour le
    télécharger... et je ne peut pas utiliser ppm puisque je suis au boulot donc ==> proxy...
    Tu sais que tu peux configurer ppm pour utiliser un proxy ?

    --
    Jedaï

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Oui je sais.

    Avant je l'ignorais mais maintenant c'est fais

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    RE!
    J'ais fais ça pour trier .
    J'ais rajouter ce bout de script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (<Fsor>){
    @line = substr(-13, 3); 
        @out = sort @line;
        print Fsor @out;
    }
    Sachant que Fsor est le fichier de sortie que j'ouvre pour trier.
    Et j'ais vu qu'on pouvait utiliser substr qui me simplifierais la vie !
    Comme les date sont à la fin de chaque phrases (voir l'exemple plus haut dans la discution)...

    Es ce possible?
    Je mis prend surment mal mais c'est pour que vous compreniez.

    Merci d'avance.

  11. #11
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Citation Envoyé par kimous
    Je mis prend surment mal
    A vrai dire, oui . Jette à nouveau un oeil à l'algo que je proposais. Comprends-tu à quoi sert un hash en l'occurrence ?

    Voilà une traduction en Perl (vite faite, en suis encore au café noir moi à ct'heure, mais testée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use Date::Parse;
    use Date::Language;
     
    my %data;
    my $parser = Date::Language->new('French');
     
    while (my $line = <>) {
        my $date = join " ", (split /\s+/, $line)[3..5];
        $data{$line} = $parser->str2time($date);
    }
     
    my @sorted_lines = sort { $data{$a} <=> $data{$b} } keys %data;
    Essaie surtout de comprendre le mécanisme puis regarde la doc pour voir comment s'est implanté (sort(), Date:arse et si nécessaire le chapitre sur les hash d'une intro à Perl, par exemple dans celle de Lhullier sur ce site).

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Waou

    Je bachote tous ça et te tiends au courant!

    Je te remercie pour ta réponse !

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 31
    Par défaut
    Bonjour,

    Je me permets de répondre à ce post pour remercier Iblis pour son apport et à ses réponses précises et bien utiles.

    Grâce à toi, j'ai pu faire le tri que je voulais. Voici le type de fichier que je traite.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    0063806643000022605901;005004444D-SA02;TTTCH1
    0063806643000022621601;007007203R-SA01;TTREJ1
    0063806643000022607201;013032190M-SA01;TTTCH1
    0063806643000022607101;013056075Y-SA01;TTTCH1
    0063806643000022607701;013057681W-SA01;TTTCH1
    0063806643000022652001;021009086W-SA01;TTTCH1
    0063806643000022587101;024019182P-SA02;TTREJ1
    0063806643000022644201;024201467G-SA01;TTREJ1
    0063806643000022622901;026016671X-SA01;TTTCH1
    0063806643000022584101;029110555D-SA01;TTREJ1
    0063806643000022634401;031118993K-SA01;TTTCH1
    0063806643000022634301;031118993K-SA01;TTTCH1
    0063806643000022635901;031202606L-SA01;TTTCH1
    0063806643000022635601;031202606L-SA01;TTTCH1
    0063806643000022635701;031202606L-SA01;TTTCH1
    0063806643000022634501;031202606L-SA01;TTTCH1
    0063806643000022635801;031202606L-SA01;TTTCH1
    0063806643000022634801;031202897Y-SA01;TTTCH1
    0063806643000022637801;032001437M-SA01;TTTCH1
    0063806643000022637901;032011448Z-SA01;TTREJ1
    0063806643000022637001;032011470T-SA01;TTTCH1
    0063806643000022644601;033206282D-SA02;TTREJ1
    0063806643000022644501;033206282D-SA02;TTREJ1
    0063806643000022642701;034030110T-SA01;TTREJ1
    0063806643000022642601;034030110T-SA01;TTREJ1
    0063806643000022650701;035023636L-SA01;TTTCH1
    0063806643000022650601;035023636L-SA01;TTREJ1
    0063806643000022650901;035023636L-SA01;TTTCH1
    0063806643000022650801;035023636L-SA01;TTREJ1
    0063806643000022624601;038120458P-SA01;TTTCH1
    0063806643000022608501;038409577M-SA01;TTTCH1
    0063806643000022649101;040003693L-SA01;TTREJ1
    0063806643000022627001;042030131U-SA01;TTTCH1
    0063806643000022610201;042111555X-SA01;TTTCH1
    0063806643000022654601;042117647H-SA01;TTTCH1
    0063806643000022621701;042213456A-SA01;TTTCH1
    0063806643000022626701;042305873R-SA02;TTREJ1
    0063806643000022631901;045014885Q-SA01;TTREJ1
    0063806643000022586901;049106694N-SA01;TTREJ1
    0063806643000022586801;049106694N-SA01;TTREJ1
    0063806643000022587001;049106694N-SA01;TTREJ1
    0063806643000022632801;049205090T-SA01;TTTCH1
    0063806643000022617601;051201135E-SA01;TTTCH1
    0063806643000022617801;051201135E-SA01;TTTCH1
    0063806643000022618001;054032844Z-SA01;TTTCH1
    0063806643000022585401;056115843S-SA02;TTREJ1
    0063806643000022585301;056200145Y-SA01;TTTCH1
    0063806643000022598101;059056181E-SA01;TTCHEV
    Le code que j'ai écrit permet de trier la deuxième colonne (différenciée par les "points-virgule).

    Seulement voilà, une ano m'a été remontée. Après le tri de la deuxième colonne, je dois ensuite trier à partir de la troisième colonne.

    Voici le code qui me permet de trier la deuxième colonne. Là aucun soucis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my %data;      
    while (my $line = <>) {
        my $tri = (split /;/, $line)[1];
        $data{$line} = $tri;
    }
     
    my @sorted_lines = sort { $data{$a} cmp $data{$b} } keys(%data);
    Au départ je voulais faire le tri de cette façon en remplaçant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $tri = (split /;/, $line)[1];
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $tri = (split /;/, $line)[1..2];
    Mais ça ne marche pas. Là je bloque.

    Pouvez-vous me dire ce qui ne vas pas svp!!

    Merci d'avance pour vos réponses. N'hésitez pas à me faire répéter si vous ne comprenez pas mon problème.


  14. #14
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Tu vas devoir combiner tes critères de tri. Une possibilité (pas la plus économe à mon avis) est d'utiliser deux hash avec les mêmes clés mais pour valeurs chacun des champs sur lesquels tu veux trier. Ensuite tu cumules les tris.

    Tu vois ce que je veux-dire ?

    Pas sûr d'être très clair. Je te montre comment je ferais (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my (%criterium1, %criterium2);
    while (<>) {
        $criterium1{$_} = ( split /;/ )[1];
        $criterium2{$_} = ( split /;/ )[2];
    }
     
    print sort { $criterium1{$a} cmp $criterium1{$b} } 
        sort { $criterium2{$a} cmp $criterium2{$b} }
            keys %criterium1;
    PS : Tu aurais pu ouvrir un nouveau fil

  15. #15
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my %criterium;
    while (<>) {
        $criterium{$_} = [ ( split /;/ )[1,2] ];
    }
     
    print sort { $criterium{$a}[0] cmp $criterium{$b}[0] || $criterium{$a}[1] cmp $criterium{$b}[1] }
            keys %criterium1;
    Est meilleur point de vue consommation mémoire (et il est beaucoup plus efficace de faire un sort multi-critère avec || qu'avec plusieurs sort).

    Je rappelle la référence pour les tris en Perl en français.

    On peut faire encore mieux, avec une transformée de Guttman et Rosler.

    --
    Jedaï

  16. #16
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Oui, bien sûr, c'est bien plus économe comme cela, merci Jedaï.

    Et soit en passant l'article des Mongeurs est très bien.

  17. #17
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    @Jedaï

    Je vois que tu as rajouté qu'on peut faire mieux avec une transformée de Guttman et Rossler.

    As-tu une idée de l'ordre de grandeur du gain (en vitesse) que procure le passage à pack (c'est à dire au fond le recours à un tri lexicographique) ? A partir de quelle quantité de données à trier dans un hash, cela vaut-il le coup ? Et dans le cas du multi-critère ? Faut-il y avoir systématique recours au dessus de 10000 entrées ?

    D'autre part, le fait d'éviter les tableaux ne procure-t-il pas un gain sur l'utilisation mémoire supérieur au gain en vitesse (dû à l'implementation en C du tri de type lexicographique) ? Et comme sur les machines actuelles ont a beaucoup de mémoire... tu vois le sens de ma question ?

Discussions similaires

  1. tri dans un fichier.txt
    Par moraito dans le forum VBScript
    Réponses: 4
    Dernier message: 20/07/2016, 17h32
  2. Ouvrir et écrire dans un fichier .txt en T-SQL
    Par joul's dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 27/10/2008, 22h04
  3. Date dans un fichier txt
    Par cali1983 dans le forum C++
    Réponses: 6
    Dernier message: 23/05/2005, 18h35
  4. Réponses: 10
    Dernier message: 05/10/2004, 12h28
  5. [langage] tabulation dans un fichier txt
    Par TigreRouge dans le forum Langage
    Réponses: 2
    Dernier message: 16/08/2004, 18h36

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