Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Trier dans un fichier

21 réponses
Avatar
Patrick
Bonjour
J'ai un soucis pour trier des enregistrement a l'interrieure d'un
fichier.

j'ai un fichier avec plusieurs enregistrements. je veux que les
enregistrement se trie dans l'ordre alphabetique par rapport =E0
l'enregistrement $toto[14]...

j'ai fait quelque chose du genre :

foreach $test01 (@PCVD)
{
chop $test01;
@xA01=3Dsplit /\|/,$test01;
@totoB2=3Dsort ({$xA01[14] } @xA01) ;

print "<font color=3Dred size=3D2 face=3Dtahoma>@totoB2<br>777\n";
print "</font>";=20
}

10 réponses

1 2 3
Avatar
Nicolas George
"Patrick" wrote in message
:
J'ai un soucis pour trier des enregistrement a l'interrieure d'un
fichier.

j'ai un fichier avec plusieurs enregistrements. je veux que les
enregistrement se trie dans l'ordre alphabetique par rapport à
l'enregistrement $toto[14]...


Tu n'es pas clair : souhaites-tu trier les lignes sur la base de la colonne
14, ou trier les colonnes de chaque ligne ?

Avatar
Patrick
Bonjour Nicolas.

Ce que j'ai c'est un fichier avec des enregistrement et je voudrais que
ces enregistrement se trient par rapport à un champ ou il y a des
codes A0 avant A1 avant G2 etc...

Exemlpe :

001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

########## JE VEUX que le trie se fasse sur le champ 14 ############

003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

Merci de m'éclairer
Amicalement
Patrick


Nicolas George wrote:
"Patrick" wrote in message
:
J'ai un soucis pour trier des enregistrement a l'interrieure d'un
fichier.

j'ai un fichier avec plusieurs enregistrements. je veux que les
enregistrement se trie dans l'ordre alphabetique par rapport à
l'enregistrement $toto[14]...


Tu n'es pas clair : souhaites-tu trier les lignes sur la base de la colon ne
14, ou trier les colonnes de chaque ligne ?



Avatar
Patrick
Bonjour Nicolas.

Ce que j'ai c'est un fichier avec des enregistrement et je voudrais que
ces enregistrement se trient par rapport à un champ ou il y a des
codes A0 avant A1 avant G2 etc...

Exemlpe :

001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

########## JE VEUX que le trie se fasse sur le champ 14 ############

003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

Merci de m'éclairer
Amicalement
Patrick


Nicolas George wrote:
"Patrick" wrote in message
:
J'ai un soucis pour trier des enregistrement a l'interrieure d'un
fichier.

j'ai un fichier avec plusieurs enregistrements. je veux que les
enregistrement se trie dans l'ordre alphabetique par rapport à
l'enregistrement $toto[14]...


Tu n'es pas clair : souhaites-tu trier les lignes sur la base de la colon ne
14, ou trier les colonnes de chaque ligne ?



Avatar
Paul Gaborit
À (at) 26 Jun 2006 06:48:34 -0700,
"Patrick" écrivait (wrote):
Ce que j'ai c'est un fichier avec des enregistrement et je voudrais que
ces enregistrement se trient par rapport à un champ ou il y a des
codes A0 avant A1 avant G2 etc...

Exemlpe :

001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

########## JE VEUX que le trie se fasse sur le champ 14 ############

003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

Merci de m'éclairer


C'est déjà beaucoup plus clair qu'avant mais ce n'est pas encore assez
précis. Comment souhaitez-vous comparer les chaînes du quatorzième
champ ? Quelles sont les valeurs possibles pour ce champ ? Peut-on
rencontrer A34 et A4, AB23 et A23 ? Et dans ce cas, comment doit-on
les classer ? Sont-elles toujours sous la forme une lettre suivie d'un
chiffre ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Patrick
Alors...

Les codes seront toujours sous la forme :

une Lettre majuscule suivit d'un chiffre 0 à 9
Exemple : A0 A1 A2...A9
ou
D0 D2 F4 R7 H2 ...ETC ...

Et ce que je cherche à faire c'est un trie alpha numerique croissant
A1 avant B9 avant E0 ...

Amicalement
Patrick
Merci
A++

Paul Gaborit wrote:
À (at) 26 Jun 2006 06:48:34 -0700,
"Patrick" écrivait (wrote):
Ce que j'ai c'est un fichier avec des enregistrement et je voudrais que
ces enregistrement se trient par rapport à un champ ou il y a des
codes A0 avant A1 avant G2 etc...

Exemlpe :

001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

########## JE VEUX que le trie se fasse sur le champ 14 ############

003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

Merci de m'éclairer


C'est déjà beaucoup plus clair qu'avant mais ce n'est pas encore assez
précis. Comment souhaitez-vous comparer les chaînes du quatorzième
champ ? Quelles sont les valeurs possibles pour ce champ ? Peut-on
rencontrer A34 et A4, AB23 et A23 ? Et dans ce cas, comment doit-on
les classer ? Sont-elles toujours sous la forme une lettre suivie d'un
chiffre ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
Paul Gaborit
À (at) 26 Jun 2006 07:44:20 -0700,
"Patrick" écrivait (wrote):
Les codes seront toujours sous la forme :

une Lettre majuscule suivit d'un chiffre 0 à 9
Exemple : A0 A1 A2...A9
ou
D0 D2 F4 R7 H2 ...ETC ...

Et ce que je cherche à faire c'est un trie alpha numerique croissant
A1 avant B9 avant E0 ...


En supposant que vos enregistrements soient dans un tableau de
tableaux (appelé @data). Vous pouvez faire cela :

foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
print join('|', @{$ligne}), "n";
}

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Patrick
Voici ce que j'ai compris

open(HANDLE,"<./dossier/admin.ann.dat"); @data=<HANDLE>; close
(HANDLE);
################################################################
foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
print join('|', @{$ligne}), "n";
}

si je veux afficher le resultat je fais ??

print " ???";
################################################################

Paul Gaborit wrote:
À (at) 26 Jun 2006 07:44:20 -0700,
"Patrick" écrivait (wrote):
Les codes seront toujours sous la forme :

une Lettre majuscule suivit d'un chiffre 0 à 9
Exemple : A0 A1 A2...A9
ou
D0 D2 F4 R7 H2 ...ETC ...

Et ce que je cherche à faire c'est un trie alpha numerique croissant
A1 avant B9 avant E0 ...


En supposant que vos enregistrements soient dans un tableau de
tableaux (appelé @data). Vous pouvez faire cela :

foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
print join('|', @{$ligne}), "n";
}

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
Paul Gaborit
À (at) 26 Jun 2006 08:20:45 -0700,
"Patrick" écrivait (wrote):
Voici ce que j'ai compris

open(HANDLE,"<./dossier/admin.ann.dat"); @data=<HANDLE>; close
(HANDLE);
################################################################
foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
print join('|', @{$ligne}), "n";
}

si je veux afficher le resultat je fais ??

print " ???";
################################################################


Avec votre code, vous lisez bien vos enregistrements mais vous ne les
éclatez pas en champs. Faites plutôt :

my @data = ();
my $filename = "./dossier/admin.ann.dat";
open my $hdl, "<", $filename
or die "Can't read file '$filename':$!n";
while (<$hdl>) {
chomp;
# en supposant que les champs soit séparés par une virgule
push @data, [split /,/, $_];
}

close $hdl;

# on trie sur le quatorzième champ
foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
# on affiche tous les champs (séparés par un |)
print join('|', @{$ligne}), "n";
}

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
tuser
Patrick wrote:
Bonjour Nicolas.

Ce que j'ai c'est un fichier avec des enregistrement et je voudrais que
ces enregistrement se trient par rapport à un champ ou il y a des
codes A0 avant A1 avant G2 etc...

Exemlpe :

001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|

########## JE VEUX que le trie se fasse sur le champ 14 ############


Je suis désolé, il n'y a pas de champ 14!

Mais si on prend le caractère "|" comme séparateur, il y a quand
même 10 champs. --> et le champ 8 contient des codes "A1", "G7",
etc...

Peut-être vous souhaitez trier par champ 8 ?

Dans ce cas, vous pouver utiliser l'élément [7] de la fonction
split() --- (mais attention, la fonction split à l'intérieur d'un
sort n'est pas du tout efficace)

========================= ========================
use strict;
use warnings;

my @lignes = <DATA>;
@lignes = sort {(split(/|/,$a))[7] cmp (split(/|/,$b))[7]} @lignes;
print for @lignes;

__DATA__
001|toto|homme|informatique|lyon|voiture|...|A5|avenir015|avenir016|
002|titi|homme|graphiste|paris|voiture|...|B0|avenir015|avenir016|
003|papa|homme|peintre|marseille|voiture|...|F1|avenir015|avenir016|
003|polo|femme|informatique|lyon|voiture|...|A1|avenir015|avenir016|
099|xxxx|enfant|plombier|Evian|voiture|...|G7|avenir015|avenir016|
========================= ========================

Par contre, si vous souhaitez une solution plus efficace, je vous
conseille de rechercher "Schwartzian Transform" sur Google

Avatar
Patrick
Bonjour
Aprés une nuit pleins d'intérogation, comme vous me l'avez indiqué
(merci) le trie marche...

J'ai une autre question, le résultat trié, je voudrais le mettre dans
un tableau pour pouvoir y effectué d'autre opérations.
Ma question, comment mettre le resultat trié dans un tableau du type
@TRIE_OK

Merci
Amicalement
Paul Gaborit wrote:
À (at) 26 Jun 2006 08:20:45 -0700,
"Patrick" écrivait (wrote):
Voici ce que j'ai compris

open(HANDLE,"<./dossier/admin.ann.dat"); @data=<HANDLE>; close
(HANDLE);
################################################################
foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
print join('|', @{$ligne}), "n";
}

si je veux afficher le resultat je fais ??

print " ???";
################################################################


Avec votre code, vous lisez bien vos enregistrements mais vous ne les
éclatez pas en champs. Faites plutôt :

my @data = ();
my $filename = "./dossier/admin.ann.dat";
open my $hdl, "<", $filename
or die "Can't read file '$filename':$!n";
while (<$hdl>) {
chomp;
# en supposant que les champs soit séparés par une virgule
push @data, [split /,/, $_];
}

close $hdl;

# on trie sur le quatorzième champ
foreach my $ligne (sort {$a->[13] cmp $b->[13]} @data) {
# on affiche tous les champs (séparés par un |)
print join('|', @{$ligne}), "n";
}

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



1 2 3