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
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
A voir également:
- Perl: Extraction de données d'un fichier text
- Denon perl pro test - Guide
- Active perl - Télécharger - Édition & Programmation
- Can't open perl script "makefile.pl": no such file or directory - Forum Perl
- Perl ftp - Forum Perl
- Perl xampp ✓ - Forum Linux / Unix
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
28 mars 2006 à 14:35
Re,
Une autre solution (maintenant je suis en pause).
Le résultat
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 ~]#
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
28 mars 2006 à 08:25
Salut,
vite fait avant partir au boulot (c'est la grève aujourd'hui)
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]$
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.
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
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
26 oct. 2009 à 09:47
Up up up!!
Moi aussi je suis intéressé ;)
Merci d'avance.
Moi aussi je suis intéressé ;)
Merci d'avance.
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
27 mars 2006 à 16:41
Bonjour,
Philippe
#!/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
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
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
(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
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
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 :
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 9Ou 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]$;-))
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
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
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