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
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
Bonjour,
Oui, il existe la fonction sort. Elle permet de trier tout et n'importe quoi de n'importe quelle manière.Envoyé par donny
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 !
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.Envoyé par donny
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 !
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 ?
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 ...Envoyé par donny
Ce n'est pas testé, mais on ne doit pas être loin de la vérité.
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;
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
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
Exemple avec d'autre chiffre:
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"; }
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
comme resultat j'ai 1 au lieu d'une liste de fichier trié
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"; }
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
exact c'etait cela
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);
et donc j'alimente en meme temps un autre fichier.
une question pour comparé deux fichier
je peux utiliser cmp ? ou <=> ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part fichier1 cmp fichier2;
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 !
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
Pour la comparaison entre deux fichiers, il y a plusieurs possibilités :Envoyé par donny
- 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 !
ok
et pour lire deux fichier ligne à ligne et les comparé
il faut que je les ouvre
puis pour les comparer ligne à ligne, je dois faire une boucle ?
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>
il existerait pas quelquechose comme EOF ?
Attention, il y a des erreurs de syntaxe dans l'ébauche de code que tu as donné (; en fin de ligne, par exemple).
Oui, il faut faire une boucle. La lecture des lignes doit se trouver dans celle-ci.Envoyé par donny
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 !
probleme classique quand on connait le langage
il faut utiliser 2 boucle for imbriquer ?
Envoyé par donnyLa programmation ne se limite pas à la maîtrise d'un langage.Envoyé par 2Eurocents
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 !
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager