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 façon Excel


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PadawanInPerl
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 462
    Par défaut tri façon Excel
    Bonjour,

    je crée à partir d'un fichier tabulé un fichier Excel. Par la suite je dois faire des tris...

    Mais cela ne me convient pas pour diverses raisons.

    Je dois trier sur deux champs...ces deux champs (et même les autres ) peuvent être totalement identiques (mais je dois les conserver)

    Je lu pas mal de discussion, mais je ne parviens pas à me représenter la façon de faire...pour trier sur deux champs

    J'imaginais dans un boucle while faire ça : (c'est en abrégé, bien sûr )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    $result = $tab[0]."\t".$tab[1]."\t".$tab[2]."\t".$tab[3];
     
    @total = $result;
     
    $result ='';
    Après trier sur les champs $tab[1] (tri numérique) puis $tab[2](tri alphabétique) ... mais je sais pas comment

    sortir un fichier et le remonter dans Excel.

    Merci pour votre future aide

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonjour,

    Tu as 2 solutions :
    1. Tu convertis ton fichier txt en Excel puis effectue le trie manuellement dans Excel.
    2. Tu tries ton fichier via perl, puis génère le fichier Excel.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Si tu disposes d'un fichier excel tabulé, le tri sur plusieurs colonnes sera efficace en utilisant une transformation Schwarzienne (comme ici).

    Pour ton cas, quelque chose comme (en imaginant que tu tries numériquement sur la colonne 2 (indice 1) et alphabétiquement sur la colonne 3 (indice 2)) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @trie =  map { join "\t", @$_ }
      sort { $a->[1] <=> $b->[1] || $a->[2] cmp $b->[2] }
      map { [ split /\t/ ] } @non_trie;

  4. #4
    Membre éclairé Avatar de PadawanInPerl
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 462
    Par défaut
    Merci

    J'essaie... et reviens mettre en résolut...ou pas

  5. #5
    Membre éclairé Avatar de PadawanInPerl
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 462
    Par défaut
    J'ai un peu du mal à l'appliquer, je pense que ça vient du fait que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @trie =  map { join "\t", @$_ }
    Ne correspond pas à mon souci car les champs que je veux ne sont pas dans l'ordre...

    Mon exemple était pas très bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result = $tab[0]."\t".$tab[1]."\t".$tab[2]."\t".$tab[3];
    Voici ce que j'aurais en réalité...du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = $tab[3]."\t".$tab[1]."\t".$tab[0]."\t".$tab[2];
    Je met mon code entier... avec ta proposition telquel comme ça

    mais avant ...je ne sais plus quoi renvoyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sommaire->write($ligne,0,$non_trie[0],$centre);
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
    use Spreadsheet::WriteExcel;
     
    # open IN,'<:encoding(utf8)','xxx.utx' or die "$!";
    open IN,"<xxx.utx" or die "$!";
     
    # Crée le fichier xls (wb pour workbook)
    my $wb=Spreadsheet::WriteExcel->new("Sortie_JDI-2.xls");
     
    # Variable qui définit l'alignement des données
    my $centre = $wb->add_format();
      $centre->set_align('center');
     
    # Variable qui définit l'alignement TITRE
    my $centre_titre = $wb->add_format();
      $centre_titre->set_align('center');
      $centre_titre -> set_bold ('1');
      $centre_titre -> set_valign ('vcenter');
      $centre_titre->set_bg_color('cyan');
     
    # Création de la premiere feuille "sommaire"
    my $sommaire=$wb->add_worksheet('Tri par N° de commande (N° cde)');
     
    $sommaire->write('A1', 'Date',$centre_titre);
    $sommaire->write('B1', 'N° cde', $centre_titre);
    $sommaire->write('C1', 'Auteur', $centre_titre);
    $sommaire->write('D1', 'Titre',$centre_titre);
    $sommaire->write('E1', 'Fournisseur',$centre_titre);
    $sommaire->write('F1', 'Prix',$centre_titre);
    $sommaire->write('G1', 'Quant.',$centre_titre);
    $sommaire->write('H1', 'N° compte',$centre_titre);
    $sommaire->write('I1', 'Compte',$centre_titre);
    $sommaire->write('J1', 'N° sujet',$centre_titre);
    $sommaire->write('K1', 'Sujet',$centre_titre);
     
    # Intercalation de ligne noir/blanc pour les lignes sans parametres
    my  $intercal = $wb->add_format();
      $intercal-> set_bg_color('silver');
      $intercal -> set_valign ('vcenter');
     
    # Intercalation de ligne noir/blanc pour les lignes pocédent deja un parametre
    my  $centInter = $wb->add_format();
      $centInter->set_align('center');
      $centInter->set_bg_color('silver');
      $centInter -> set_valign ('vcenter');
     
    # Fige les volets : 1ere ligne
          $sommaire->freeze_panes(1, 0);
     
    my $ligne=1;
     
    # Début du traitement
    while (my $line=<IN>)
    {
     
    chomp $line;
     
    my  @tab = split(/\t/,$line);
     
    if ( length($tab[13]) > 243 ){ $tab[13] = substr($tab[13],0,243); $tab[13] .= "...";}
     
    my $result = $tab[6]."\t".$tab[7]."\t".$tab[5]."\t".$tab[12]."\t".$tab[13]."\t".$tab[8]."\t".$tab[9]."\t".$tab[3]."\t".$tab[4]."\t".$tab[10]."\t".$tab[11];
     
    my @total = $result;
     
    $result ='';
     
    }
     
    @trie =  map { join "\t", @$_ }
             sort { $a->[1] <=> $b->[1] || $a->[2] cmp $b->[2] }
             map { [ split /\t/ ] } @non_trie;
     
     
     
      if ($ligne%2!=0){
     
             $sommaire->write($ligne,0,$non_trie[0],$centre); # date
             $sommaire->write($ligne,1,$non_trie[1],$centre); # nmr cde + nmr ligne
             $sommaire->write($ligne,2,$non_trie[2]);         # auteur
             $sommaire->write($ligne,3,$non_trie[3]);        # titre
             $sommaire->write($ligne,4,$non_trie[4]);        # fournisseur
             $sommaire->write($ligne,5,$non_trie[5],$centre); # prix
             $sommaire->write($ligne,6,$non_trie[6],$centre); # quantité
             $sommaire->write($ligne,7,$non_trie[7],$centre); # nmr cpt
             $sommaire->write($ligne,8,$non_trie[8]);         # cpt
             $sommaire->write($ligne,9,$non_trie[9],$centre);# nmr sujet
             $sommaire->write($ligne,10,$non_trie[10]);       # sujet
             $ligne++;
             }
     
      else {
     
             $sommaire->write($ligne,0,$non_trie[0],$centInter);  # date
             $sommaire->write($ligne,1,$non_trie[1],$centInter);  # nmr cde + nmr ligne
             $sommaire->write($ligne,2,$non_trie[2],$intercal);   # auteur
             $sommaire->write($ligne,3,$non_trie[3],$intercal);  # titre
             $sommaire->write($ligne,4,$non_trie[4],$intercal);  # fournisseur
             $sommaire->write($ligne,5,$non_trie[5],$centInter);  # prix
             $sommaire->write($ligne,6,$non_trie[6],$centInter);  # quantit
             $sommaire->write($ligne,7,$non_trie[7],$centInter);  # nmr cpt
             $sommaire->write($ligne,8,$non_trie[8],$intercal);   # cpt
             $sommaire->write($ligne,9,$non_trie[9],$centInter); # nmr sujet
             $sommaire->write($ligne,10,$non_trie[10],$intercal); # sujet
             $ligne++;
             }

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je ne comprends pas bien ton code, car tu lis le fichier, et tu écris dans le même temps dans ton $sommaire...
    Tu ne peux pas trier ton fichier d'entrée "en cours de lecture".
    Il faut le lire en totalité, le trier en mémoire, et le traiter une fois trié.

    Je t'invite à remplacer
    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
    # Début du traitement
    while (my $line=<IN>)
    {
     
    chomp $line;
     
    my  @tab = split(/\t/,$line);
     
    if ( length($tab[13]) > 243 ){ $tab[13] = substr($tab[13],0,243); $tab[13] .= "...";}
     
    my $result = $tab[6]."\t".$tab[7]."\t".$tab[5]."\t".$tab[12]."\t".$tab[13]."\t".$tab[8]."\t".$tab[9]."\t".$tab[3]."\t".$tab[4]."\t".$tab[10]."\t".$tab[11];
     
    my @total = $result;
     
    $result ='';
     
    }
     
    @trie =  map { join "\t", @$_ }
             sort { $a->[1] <=> $b->[1] || $a->[2] cmp $b->[2] }
             map { [ split /\t/ ] } @non_trie;
    Par ceci :

    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
    my @table;
    # Début du traitement
    while (my $line=<IN>)
    {
      chomp $line;
     
      my  @tab = split(/\t/,$line);
     
      if ( length($tab[13]) > 243 ){
        $tab[13] = substr($tab[13],0,243);
        $tab[13] .= "...";
      }
     
      push @table, [ $tab[6], $tab[7], $tab[5], $tab[12], $tab[13], $tab[8], $tab[9], $tab[3], $tab[4], $tab[10], $tab[11];
    }
     
    foreach my $data (sort { $a->[1] <=> $b->[1] || $a->[2] cmp $b->[2] } @table) {
     
      if ($ligne%2!=0){
    ...
    Lors de la lecture du fichier, chaque ligne est découpée, et les colonnes rangées dans un tableau de tableau. En suite, la boucle foreach trie ce tableau et le traite.

  7. #7
    Membre éclairé Avatar de PadawanInPerl
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 462
    Par défaut
    Citation Envoyé par Philou67430 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
      push @table, [ $tab[6], $tab[7], $tab[5], $tab[12], $tab[13], $tab[8], $tab[9], $tab[3], $tab[4], $tab[10], $tab[11];
    }
    HEllo, merci pour ta réponse et de me faire voir mes stupidités de pseudo-"programmation"


    Dans ce que je cite plus haut ne manque t-il pas un crochet...ou y- en a t-il un en trop ?

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

Discussions similaires

  1. [Tableau html] Fractionnement "à la façon Excel"
    Par VoidTech dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/05/2007, 14h21
  2. Problème de tri dans excel
    Par fabou3377 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/10/2006, 07h20
  3. Réponses: 6
    Dernier message: 01/06/2006, 16h11
  4. Tri dans excel ?
    Par Paulkouhan dans le forum C++Builder
    Réponses: 9
    Dernier message: 11/10/2005, 09h27
  5. Tri colonne Excel avec Office Partner
    Par Hollow dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/06/2005, 19h37

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