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

Fermé
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006 - 27 mars 2006 à 15:17
trashvip Messages postés 27 Date d'inscription samedi 4 septembre 2004 Statut Membre Dernière intervention 10 mars 2010 - 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
A voir également:

7 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 mars 2006 à 14:35
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 ~]#
2
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 mars 2006 à 08:25
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]$
1
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.
1
trashvip Messages postés 27 Date d'inscription samedi 4 septembre 2004 Statut Membre Dernière intervention 10 mars 2010 5
26 oct. 2009 à 09:47
Up up up!!
Moi aussi je suis intéressé ;)
Merci d'avance.
0
philtrain Messages postés 169 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 25 juillet 2010 73
27 mars 2006 à 16:41
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
philtrain Messages postés 169 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 25 juillet 2010 73
27 mars 2006 à 17:56
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 mars 2006 à 18:03
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]$
;-))
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
27 mars 2006 à 17:15
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
-1