Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1616 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Perl: Extraction de données d'un fichier texte.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Perl: Extraction de données d'un fichier texte.

n°1332865
fiftoman
Posté le 27-03-2006 à 14:59:35  profilanswer
 

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.
 

mood
Publicité
Posté le 27-03-2006 à 14:59:35  profilanswer
 

n°1332878
anapajari
s/travail/glanding on hfr/gs;
Posté le 27-03-2006 à 15:15:08  profilanswer
 

Bin tu commences par prendre ton script qui lit le fichier:

Code :
  1. #!/usr/bin/perl
  2. open (fichier, '3lignes.txt');
  3. $i=0;
  4. while(<fichier> ) {
  5. $i++;
  6. }
  7. close fichier;
  8. print "nombre de lignes: $i";


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 :
  1. cat fichier.txt | cut -d ' ' -f 4,5 > fichier2.txt


 
edit: grrr de balises code


Message édité par anapajari le 27-03-2006 à 15:16:12
n°1332928
fiftoman
Posté le 27-03-2006 à 16:16:23  profilanswer
 

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.
À + !  

n°1332945
anapajari
s/travail/glanding on hfr/gs;
Posté le 27-03-2006 à 16:27:27  profilanswer
 

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 :
  1. my $i=0;


Et puis la tu ne lis pas la ligne mais tu les comptes, si tu veux la lire tu as deux solutions:
- utilise $_

Code :
  1. while ( <fichier> ){
  2. print $_;
  3. }


- faire une assignation dans ta boucle:

Code :
  1. while ( $ligne = <fichier> ){
  2. print $ligne;
  3. }


Je te conseillerais la deuxième méthode, plus lisible quand on débute. Et n'oublie pas de déclarer $ligne!

n°1332956
fiftoman
Posté le 27-03-2006 à 16:43:04  profilanswer
 

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

n°1333012
anapajari
s/travail/glanding on hfr/gs;
Posté le 27-03-2006 à 17:34:53  profilanswer
 

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 :
  1. my @cols;
  2. while( $ligne= <fichier> ) {
  3. @cols = split(/ /, $sentence);
  4. ### apres si tu veux afficher la col 0 tu fais
  5. print $col[0];
  6. ### la colonne 2
  7. print $col[2];
  8. }


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


Message édité par anapajari le 27-03-2006 à 17:36:31
n°1333318
fiftoman
Posté le 28-03-2006 à 09:53:17  profilanswer
 

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.

n°1333331
fiftoman
Posté le 28-03-2006 à 10:23:01  profilanswer
 

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
 

n°1333357
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-03-2006 à 10:44:03  profilanswer
 

normal c'est n'importe quoi !!! :o
 
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.
Global symbol "sentence" requires explicit package name at ./script.pl line 7.
Global symbol "col" requires explicit package name at ./script.pl line 8.


tu as oublié de déclarer $ligne, $sentence et $col
 
enfin ça a la fin de ton script c'est vraiment ridicule:

Code :
  1. close (new);
  2. open (new);

n°1797077
maestro130​3
Posté le 08-10-2008 à 11:58:19  profilanswer
 

Bonjour à tous
Finalement qu'est ce qui a été décidé. CAD: comment les colonnes ont été extraites dans un autre fichier.

mood
Publicité
Posté le 08-10-2008 à 11:58:19  profilanswer
 

n°1797363
Taz
bisounours-codeur
Posté le 08-10-2008 à 17:58:48  profilanswer
 

awk / perl -a


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Perl: Extraction de données d'un fichier texte.

 

Sujets relatifs
Problème de ponctuation ds un fichier texte dynamique ds flashafficher le calendrier pour remplir un champs texte avec une date
Recuperation automatique de données sur le webrecuperer chemin fichier
Javascript est les bases de donnéeschemin fichier
PHPBB texte barré ?[résolu] fichier quitter en cliquant sur un bouton
Encadrer du texte qui "dépasse" avec vba 
Plus de sujets relatifs à : Perl: Extraction de données d'un fichier texte.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR