Rechercher : dans
Par :

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

Dernière réponse le 26 oct 2009 à 09:47:35 fifto, le 27 mar 2006 à 15:17:53 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Perl: Extraction de données d'un fichier text » dans :
Créer un fichier Autorun.inf VoirCréation de fichier autorun Autoriser l'exécution automatique Création du fichier autorun.inf Personnaliser l'icône Personnaliser le texte Personnaliser le menu Autoriser l'exécution automatique Une fonctionnalité de Windows...
MySQL - Chargement d'un fichier texte dans une table VoirPour charger une fichier texte défini comme suit : $ tail /home/user1/test.txt 'nom1',1,9 'nom2',2,3 'nom3',3,54 'nom4',4,2 'nom5',5,9 Dans une table définie comme suit : CREATE TABLE chargertest ( ...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Fichier DAT VoirFormat DAT Un fichier DAT Un fichier .dat est un fichier de données (.DAT signifie data). En général, il s'agit d'un fichier binaire, créé par un programme et utilisable uniquement par ce programme, ce qui signifie qu'il n'est pas censé être ouvert...
Formats et extensions de fichiers VoirRemarque : La liste ci-dessous n'est pas exhaustive et certains noms d'extension peuvent avoir plusieures fonctionnalités. Quant aux programmes proposés pour utiliser ces fichiers, ils ne sont pas forcément les seuls, ni les plus...

1

philtrain, le 27 mar 2006 à 16:41:19

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 --- O Espirito da Liberdade ---

Répondre à philtrain

2

fifto, le 27 mar 2006 à 17:15:12

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

Répondre à fifto

3

philtrain, le 27 mar 2006 à 17:56:27

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 --- O Espirito da Liberdade ---

Répondre à philtrain

4

jipicy, le 27 mar 2006 à 18:03:13

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]$
;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

5

lami20j, le 28 mar 2006 à 08:25:00

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]$

Répondre à lami20j

6

lami20j, le 28 mar 2006 à 14:35:12
  • +1

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 ~]#

Répondre à lami20j

7

Yoda, le 30 jun 2009 à 16:43:55

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.

Répondre à Yoda

8

 trashvip, le 26 oct 2009 à 09:47:35

Up up up!!
Moi aussi je suis intéressé ;)
Merci d'avance.

Répondre à trashvip