VIVEZ LE
FOOTBALL !

Posez votre question Signaler

Perl: Extraction de données d'un fichier text

fifto 54Messages postés 24 mars 2006Date d'inscription - Dernière réponse le 26 oct. 2009 à 09:47
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.
Miguel
Lire la suite 

Perl: Extraction de données d'un fichier text »

8 réponses
Réponse
+2
moins plus
Re,

Une autre solution (maintenant je suis en pause).

#! /usr/bin/perl

use warnings;

@ARGV = qw (/home/lami/fifto.txt);
open FIC_W,">","/home/lami/fifto_res.txt"
		or die "Impossible de creer le fichier : $!_n";
while (<>){
	s/(.*)/join " ",(split " ", $1)[3,5]/e;
	print FIC_W $_;
}


Le résultat
[root@localhost ~]# cat /home/lami/fifto.txt
okokok x y t w a
aaaaa 1 2 3 4 5
45678 2 9 8 4 3
[root@localhost ~]# ls /home/lami/fifto_res.txt
ls: /home/lami/fifto_res.txt: Aucun fichier ou répertoire de ce type
[root@localhost ~]# perl ccm_fifto2
[root@localhost ~]# cat /home/lami/fifto_res.txt
t a
3 5
8 3
[root@localhost ~]#
Ajouter un commentaire
Réponse
+1
moins plus
Salut les experts,

Les bouts de codes ci-dessus me donnent déjà quelques pistes de réflexion, cependant étant totalement novice en programmation . . . J'ai quelques difficultés à les adapter à mon cas . . . :s

Grosso modo, j'ai quelques milliers de fichiers textes (7300 pour être très précis) et ces .txt contiennent des infos comme présenté ci-après :


3 PARAMETERS ON 05JAN01.
1 AZU1 STA X -0.247297943318988E+07 +- 0.241394876950605E-02
2 AZU1 STA Y -0.467133800760033E+07 +- 0.374164031593362E-02
3 AZU1 STA Z 0.355810775092403E+07 +- 0.257172727253398E-02
2 1 0.571958818322482E+00
3 1 -0.659378461245129E+00
3 2 -0.847505892381651E+00
AZU1 ANTENNA LC 0.1636 0.0000 0.0000 !up north east (m)


Pour traiter ces données, il faudrait que crée un tableau excel, avec les 3 valeurs en gras, situées dans 3 colonnes différentes. Je suis donc au tout début du processus, puisque je compte extraire ces 3 valeurs et les placer dans un fichier texte, pour ensuite créer un .xls.

Pour extraire ces 3 valeurs, je comptais utiliser grep (comme dans l'exemple de script bash), et je réussis évidemment à extraire mes 3 valeurs, mais sur des lignes différentes . . . Comment faire pour que l'output dans le txt se fasse sur une ligne ?

Si quelqu'un a une idée . . .
D'avance merci . . .
Yoda.
trashvip- 26 oct. 2009 à 09:47
Up up up!!
Moi aussi je suis intéressé ;)
Merci d'avance.
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,
#!/usr/bin/perl -w
use strict;
use warnings;

open(FILE, "fichier1.txt") || die "Erreur E/S : $!\n";
my @contenu = <FILE>;
close(FILE);

open(FILE, "fichier2.txt") || die "Erreur E/S : $!\n";
foreach (@contenu) {
    my @datas = split(/ /, $_);
    print FILE "$datas[3] $datas[5]\n";
}
close(FILE);


Philippe
Ajouter un commentaire
Réponse
+0
moins plus
la fonction split "éclate" la chaine stockée dans la variable $_ en fonction du délimiteur se trouvant entre les /, donc ici le caractère blanc.
(voir perldoc -f split)
Le résultat est stocké dans le tableau @datas

Pour récupérer les lignes 102 et 105, un simple test sur $datas[0] devrait suffire.

Philippe
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Si je puis me permettre, puisque tu es sous Unix, avec un simple filtre comme "grep" (ou "egrep") et un "pipe" ( | ) avec "awk" devrait faire l'affaire. En ligne de commande :
[jp@MDK tmpfs]$ cat file.txt
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

[jp@MDK tmpfs]$ egrep "102|105" file.txt | awk '{ print $4" " $6 }'
8 3
7 9
Ou dans un script :
[jp@MDK tmpfs]$ cat batch.sh
#! /bin/bash

egrep "$1|$2" < file.txt | awk '{ print $4" "$6 }'

[jp@MDK tmpfs]$ sh batch.sh 102 105
8 3
7 9

[jp@MDK tmpfs]$
;-))
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

vite fait avant partir au boulot (c'est la grève aujourd'hui)

[lamitest@localhost corbeille]$ cat ccm_file_fifto
okokokok x y t w a
aaaaa 1 2 3 4 5
45678 2 9 8 4 3
[lamitest@localhost corbeille]$ perl -pi.orig -e 's/[\w\s]+(\w\s)\w\s(\w\s)/$1$2/g' ccm_file_fifto
[lamitest@localhost corbeille]$ cat ccm_file_fifto
t a
3 5
8 3
[lamitest@localhost corbeille]$
Ajouter un commentaire
Réponse
-1
moins plus
merci Philippe !

Il y a cependant une ligne que je capte pas:

my @datas = split(/ /, $_);

en particulier split(//,$_)

je dois effectivement comprendre ca car en fait, ce que je dois faire plus précisément c'est ca:

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
Ajouter un commentaire
Ce document intitulé « Perl: Extraction de données d'un fichier text » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?