Perl: Extraction de données d'un fichier texte. - Perl - Programmation
Marsh Posté le 27-03-2006 à 15:15:08
Bin tu commences par prendre ton script qui lit le fichier:
Code :
|
D'abord tu rajoutes un 'use strict' pour prendre des bonnes habitudes et déclarer tes variables toussa toussa.
Tu rajoutes l'ouverture d'un fichier en lecture en même temps.
Tu lis tes lignes une a une dans le fichier1.
Tu fais un split sur ' ', tu récupères les "colonnes" du tableau qui t'interessent et tu les "prints" dans fichier2.
Ecris tout ça et montre nous ou tu bloques.
A noter tout de même qu'en bash ça prend une ligne ton truc:
Code :
|
edit: grrr de balises code
Marsh Posté le 27-03-2006 à 16:16:23
ouais en fait, pour aller jusqu'à l'étape "tu lis les lignes une À une danbs le fichier1" ca donne ca non ? :
#!/usr/bin/perl
use strict;
use warnings;
open (fichier, 'fichier1.txt');
$i=0;
while(<fichier> ) {
$i++;
};
Maintenant, je vais voir de plus près ce que c'Est que split.
À + !
Marsh Posté le 27-03-2006 à 16:27:27
oui ça donne ça sauf que ton truc ne doit pas compiler vu qu'il manque la déclaration de $i et que tu es en use strict:
Code :
|
Et puis la tu ne lis pas la ligne mais tu les comptes, si tu veux la lire tu as deux solutions:
- utilise $_
Code :
|
- faire une assignation dans ta boucle:
Code :
|
Je te conseillerais la deuxième méthode, plus lisible quand on débute. Et n'oublie pas de déclarer $ligne!
Marsh Posté le 27-03-2006 à 16:43:04
ouais ok, donc ca donnerait ca pour le moment:
#!/usr/bin/perl
use strict;
use warnings;
open (fichier, 'fichier1.txt');
my $i=0;
my $ligne;
while( $ligne= <fichier> ) {
print $ligne;
};
par contre, à la vue des fichiers textes que je vais devoir manipuler, ce que je dois faire c'est plus exactement la meme chose.
le fichier fichier1.txt ressemble à ca en fait:
okokokok x y t w a
101 1 2 3 4 5
102 2 9 8 4 3
103 5 4 8 7 3
104 5 9 8 7 6
105 2 5 7 8 9
Et je dois extraire non seulement les colonnes t a, mais seulement pour les lignes 102 et 105 par exemple.
le fichier2.txt doit donc etre le suivant au final:
# t a
8 3
7 9
Mais en fait split, ca vient plus tard non ? si j'ai bien compris, ca sert à transformer des caractères mais pas encore à les identifier.
Par quelle fonction je pourrais identifier - selectionner - ceux qui m'interessent ?
merci !
Miguel
Marsh Posté le 27-03-2006 à 17:34:53
non split ça sert à:
Citation : A very useful function in Perl is split, which splits up a string and places it into an array. |
Donc ça eclate une chaine de caractère en un tableau!
Dans ton code ça donnerait :
Code :
|
a condition que le séparateur de colonne soit bien un espace et pas un tab, dans le cas contraire remplace le
/ / |
par
/\t/ |
Et tu n'as plus qu'à balourder ça dans l'autre fichier text!
edit: pas besoin de ; quand tu "fermes" ton while
Marsh Posté le 28-03-2006 à 09:53:17
en fait, si j'ai bien compris les tutoriles, pour écrire ces colonnes dans le nouveau
fichier, je dois d'abord créer ce nouveau fichier en faisant $new = "$fichier2.txt$$";
et rajouter un new après print ?
Ca donnerait ca :
$new = "$fichier2.txt$$";
my @cols;
while( $ligne= <fichier> ) {
@cols = split(/ /, $sentence);
### apres si tu veux afficher la col 0 tu fais
print new $col[0];
### la colonne 2
print new $col[2];
}
close (new)
open (new)
Je vais tenter ca, je te dirais ce que ca donne.
Marsh Posté le 28-03-2006 à 10:23:01
ouais en fait, ca tourne pas. Pb de déclaration de variables ??
Voici ce que ca donne:
TRNG_MUNC::essais_reponses_forums> l
total 61
-rw-rw-rw- 1 mwesteel play 157 Mar 27 14:02 3lignes.txt
-rw-rw-rw- 1 mwesteel play 254 Mar 27 12:13 comment_faire_et_executer_programme_perl.txt
-rwxrwxrwx 1 mwesteel play 112 Mar 28 10:16 compteurdelignesok.pl
-rw-rw-rw- 1 mwesteel play 28160 Mar 27 14:44 cours perl a retenir.doc
-rw-rw-rw- 1 mwesteel play 100 Mar 28 09:39 fichier1.txt
-rwxrwxrwx 1 mwesteel play 196 Mar 28 10:19 script.pl
-rwxrwxrwx 1 mwesteel play 64 Mar 28 10:13 somme.pl
TRNG_MUNC::essais_reponses_forums> chmod +x script.pl
TRNG_MUNC::essais_reponses_forums> ./script.pl
Global symbol "new" requires explicit package name at ./script.pl line 4.
Global symbol "fichier2" requires explicit package name at ./script.pl line 4.
Global symbol "ligne" requires explicit package name at ./script.pl line 6.
Global symbol "sentence" requires explicit package name at ./script.pl line 7.
Global symbol "col" requires explicit package name at ./script.pl line 8.
Execution of ./script.pl aborted due to compilation errors.
Miguel
Marsh Posté le 28-03-2006 à 10:44:03
normal c'est n'importe quoi !!!
Je te conseille vraiment d'apprendre avant de te lancer directement dans ton truc parce que la s'pas top! Et aussi de lire les erreurs:
Citation : Global symbol "new" requires explicit package name at ./script.pl line 4. |
Tu as encore oublier de déclarer 'new' à la ligne 4
Citation : Global symbol "fichier2" requires explicit package name at ./script.pl line 4. |
Tu as oublié de déclarer fichier 2, et puis c'est pas du tout comme ça qu'on ouvre un fichier en écriture en perl, voir ce tut
Citation : Global symbol "ligne" requires explicit package name at ./script.pl line 6. |
tu as oublié de déclarer $ligne, $sentence et $col
enfin ça a la fin de ton script c'est vraiment ridicule:
Code :
|
Marsh Posté le 08-10-2008 à 11:58:19
Bonjour à tous
Finalement qu'est ce qui a été décidé. CAD: comment les colonnes ont été extraites dans un autre fichier.
Marsh Posté le 27-03-2006 à 14:59:35
Hello !
Grâce à vous tous et aux tutoriels sur internet, j'ai réussi à faire tourner sous Unix mes premiers programmes perl.
Il y a cependant quelque chose que je ne parviens pas à faire:
Comment on extrait des données d'un fichier texte ?
Je m'explique:
Voici par exemple mon fichier texte fichier1.txt :
okokokok x y t w a
aaaaa 1 2 3 4 5
45678 2 9 8 4 3
J'aimerais creer À partir de ce fichier un autre fichier texte fichier2.txt qui contiendrait juste les colonnes t et a:
nouveau fichier texte fichier2.txt:
# t a
3 5
8 3
Quelqu'un sait faire ca ? Ou me mettre sur la voie ?
merci.