#26 Le 01/04/2015, à 13:35
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
Merci @Postmortem sa marche super :D:D:D
serait-il possible d'expliquer cette commande s'il te plait afin que je comprenne , en la découpant. Il y a des morceaux que je comprend et d'autre pas
Hors ligne
#27 Le 02/04/2015, à 08:25
- Postmortem
Re : AIDE sur le filtrage de données
Salut,
/^[ \t]*MODAL EFFECTIVE MASS[ \t]*$/ { i=1 } : quand awk croise une ligne ne contenant que la chaîne "MODAL EFFECTIVE MASS", éventuellement entourée par des espaces et/ou des tabulations, on donne la valeur 1 à la variable i.
i && $1 ~ /^[0-9]+$/ { j=1; print $1,$3,$4,$5 } : si la variable i est non nulle et que le 1er champ de la ligne est composé d'au moins un chiffre (et que de chiffres), on donne la valeur 1 à j et on affiche les champs voulus.
i && j && $1 !~ /^[0-9]+$/ {i=j=0} : si les variables i et j sont non nulles et que le 1er champ de la ligne n'est pas composé que de chiffres, on donne la valeur 0 à i et j.
Pour mieux comprendre, voilà une autre façon d'écrire la commande awk :
awk '$0 ~ /^[ \t]*MODAL EFFECTIVE MASS[ \t]*$/ { i=1 }
(i != 0) && ($1 ~ /^[0-9]+$/) { j=1; print $1,$3,$4,$5 }
(i != 0) && (j != 0) && ($1 !~ /^[0-9]+$/) { i=0; j=0 }' fichier
Et je viens de m'apercevoir que pour le dernier pattern, il n'y a pas besoin de tester la valeur de i étant donné que j ne pourra valoir 1 que lorsque i vaut 1.
Ça donne donc :
awk '$0 ~ /^[ \t]*MODAL EFFECTIVE MASS[ \t]*$/ { i=1 }
(i != 0) && ($1 ~ /^[0-9]+$/) { j=1; print $1,$3,$4,$5 }
(j != 0) && ($1 !~ /^[0-9]+$/) { i=0; j=0 }' fichier
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#28 Le 02/04/2015, à 09:34
- MicP
Re : AIDE sur le filtrage de données
J'avoue que je suis un peu paumé quand au format du fichier source, et que je vois que benji1525 trouve que ça fonctionne bien.
Le premier champ de l'exemple donné dans la page web http://femci.gsfc.nasa.gov/modal_wtc/mmp.html
ressemble plutôt à une numérotation de ligne plutôt qu'à une représentation d'une donnée de type réel.
Si c'est l'exemple donné dans http://femci.gsfc.nasa.gov/modal_wtc/mmp.html qui est utilisé,
ne faudrait-il pas incrémenter les valeurs des indexs des champs à extraire => commencer par $2 ?
Dernière modification par MicP (Le 02/04/2015, à 09:35)
Hors ligne
#29 Le 02/04/2015, à 19:48
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
@MicP le fichier que j'ai présenté au début a exactement la même forme que celui du lien que j'ai donné. Le représenter comme j'ai fait était un peu différent pardon.
Sur le lien il faut bien évidement s'imaginer les numéros de lignes
@Postmortem merci pour ces explications
Hors ligne
#30 Le 02/04/2015, à 19:57
- MicP
Re : AIDE sur le filtrage de données
Merci pour la précision,
Désolé : je suis sans doute un peu fatigué.
Hors ligne
#31 Le 03/04/2015, à 13:32
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
En tout cas merci à tout le monde
savez vous si ces méthodes peuvent être réalisées en python??
Hors ligne
#32 Le 03/04/2015, à 21:23
- pingouinux
Re : AIDE sur le filtrage de données
Bonsoir,
savez vous si ces méthodes peuvent être réalisées en python??
Oui…
Ajouté : Plus sérieusement, voici script.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
import sys, re
titre='TOTO MIN REAL GOOD'
rec=re.compile('\n[ \t]*%s.*?\n([ \t]*?[\d.].*?)\n\n'%titre,re.S)
with open(sys.argv[1],'r') as f: fic=f.read()
k=rec.search(fic)
if(k) :
for lig in k.group(1).split('\n') :
ligspl=lig.split()
# Pour avoir les champs 1, 3 et 4 (commencent à 0)
print('%s %s %s'%(ligspl[0],ligspl[2],ligspl[3]))
à appeler ainsi, après l'avoir rendu exécutable, et y avoir choisi les champs à écrire
./script.py fichier_a_lire
Dernière modification par pingouinux (Le 04/04/2015, à 08:56)
Hors ligne
#33 Le 07/04/2015, à 18:05
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
bonjour et merci pingouinux.
Je voudrais appliquer ces méthodes sur un autre fichier, je ne sais pas si je continue de poster dans cette discussion ou si je le met autre part?
Hors ligne
#34 Le 07/04/2015, à 18:12
- pingouinux
Re : AIDE sur le filtrage de données
Si le problème est similaire, tu peux continuer ici.
Hors ligne
#35 Le 07/04/2015, à 20:39
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
le fichier est du type:
http://www.lacan.upc.edu/software/caste … ode29.html
je voudrais faire les choses suivantes:
extraire certaines données d'une ligne qui contient le mot GRID
Je comprend le problème, je me suis marqué mes étapes dans une sorte d'organigramme de résolution, mais mon niveau débutant en python me ralentit:
chaine1="GRID"
chaine2="700"
1) ouvrir le fichier texte
fichier=open('toto.txt','r')
resultat= open('resultat.txt','w')
2) parcourir ligne à ligne le fichier
lignes = fichier.readlines()
3) rechercher le mot GRID(première colonne)
for chaine1 in lignes
4) rechercher dans la deuxième colonne un numéro à partir duquel je veux extraire d'autre données par exemple 700
dc à ce stade j'ai une double condition de recherche , je doit trouver le mot GRID et mon indice voulue (700) ,l'extraction de donnée devra s'arrêter lorsque l'indice vaudra 800
la je voudrais faire une boucle "tant que mon indice de la deuxième colonne commence par '7' "
stocker mes colones 2 4 5 6
while chaine2[0] in lignes??? pour ne rechercher que le caractère "7" l'extraction s'arrêtera quand on rencontrera un 8 par exemple (800) et commencera avec la présence du 7 (700)
donc dans l'exemple, stocker:
700 -4.5679 48.1890 0.00000
…etc incrément de 1 en 1
791 -18.9499 48.6821 0.00000
793 -27.2832 48.6821 15.0000
795 -27.2832 48.6821 0.00000
797 -35.6166 48.6821 15.0000
799 -35.6166 48.6821 0.00000
5) stocker les colones 2 4 5 6 (jusqu'à mes indices voulues)
x2=lignes[j][13:17] pour m'afficher 700 701.....
jeme ligne trouvées et la "place de la chaine recherchée"
de même pour x4 x5 x6
6) mettre ces colonnes dans un fichier résultat
resultat.write(x2\n,x4\n,x5\n,x6\n)
7) fermer mon fichier
fichier.close()
je ne veux pas de solutions toutes faites mais des indications qui m'aideront à avancer si possible
Dernière modification par benji1525 (Le 07/04/2015, à 21:17)
Hors ligne
#36 Le 07/04/2015, à 21:16
- pingouinux
Re : AIDE sur le filtrage de données
Tu lis les lignes une par une, et tu regardes si elles commencent par GRID, suivi d'au moins une espace ou tabulation, suivi du chiffre 7, suivi de 2 chiffres, suivi d'une espace ou tabulation. Si c'est le cas, tu isoles les différentes colonnes, et tu écris celles qui t'intéressent.
for lig in lignes :
if re.match('GRID\s+7\d{2}\s',lig) :
c1,c2,c3,c4,c5,c6 = lig.split()
resultat.write("%s %s %s %s\n"%(c2,c4,c5,c6))
Tu devrais t'en sortir avec ça, sinon montre ton script et le message d'erreur.
Hors ligne
#37 Le 07/04/2015, à 21:35
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
j'ai le message d'erreur suivant
c1,c2,c3,c4,c5,c6 = lig.split()
ValueError: need more than 4 values to unpack
en fait la double recherche que je voulais s'effectue avec le module regexp c'est sa?
et le split sert a partitionner les données contenues dans lig afin d'en extraire les données voulues?
Dernière modification par benji1525 (Le 07/04/2015, à 21:36)
Hors ligne
#38 Le 07/04/2015, à 21:41
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
if re.match('GRID\s+7\d{2}\s',lig) :
si la condition existe lig contiendra 100 lignes de 6 colonnes normalement
Hors ligne
#39 Le 07/04/2015, à 21:43
- pingouinux
Re : AIDE sur le filtrage de données
Tu traites sans doute une ligne qui n'a pas le même format que les autres (4 colonnes au lieu de 6).
Tu peux remplacer
c1,c2,c3,c4,c5,c6 = lig.split()
resultat.write("%s %s %s %s\n"%(c2,c4,c5,c6))
par
lig_spl = lig.split()
print(lig_spl) # Pour voir la ligne traitée
resultat.write("%s %s %s %s\n"%(lig_spl[1],lig_spl[3],lig_spl[4],lig_spl[5]))
Pour répondre à ton nouveau message : lig ne contient qu'une seule ligne.
Hors ligne
#40 Le 07/04/2015, à 21:50
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
oui parce que avant et après il y a d'autre données n'ayant pas le même format
Hors ligne
#41 Le 07/04/2015, à 21:56
- pingouinux
Re : AIDE sur le filtrage de données
Dans ce cas, il faut que tu montres un petit fichier de données contenant les différents formats, et ton script actuel.
Hors ligne
#42 Le 07/04/2015, à 21:59
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
non j'ai toujours une erreur :
expected an indented block
il faudrait balayer tout le fichier ayant des lignes aux formats différents mais lorsque l'on rencontre notre condition stocker les données voulues sur les lignes respectant mon critère afin d'avoir dans resultat un tableau contenant n lignes(respectant la condition) et mes 4 colonnes voulues
Hors ligne
#43 Le 07/04/2015, à 22:01
- pingouinux
Re : AIDE sur le filtrage de données
expected an indented block
Il y a une erreur dans ton script.
Hors ligne
#44 Le 07/04/2015, à 22:04
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
les autres lignes qui n'ont pas le même format ne contiennent pas GRID du tout et il y en a des milliers.
donc elles n'entrent pas dans la condition
Hors ligne
#45 Le 07/04/2015, à 22:04
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
oui c'est au niveau du lig_spl
Hors ligne
#46 Le 07/04/2015, à 22:06
- pingouinux
Re : AIDE sur le filtrage de données
Et tu crois peut-être que je vais deviner, si tu ne montres pas ton script tel qu'il est ?
Hors ligne
#47 Le 07/04/2015, à 22:27
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
oui c'est sur, mais le fichier est semblable à celui du lien que j'ai mis, avec plusieurs données différentes
import re
import string
#ouverture fichiers et fichier résultats
filin = open("test.txt","r")
lignes = filin.readlines()
resultat = open("resultat.txt","w")
#étape de recherche et stockage des résultats
for lig in lignes :
if re.match('GRID\s+12\d{5}\s',lig) :
c1 = lig.split()
print(c1)
resultat.write("%s %s %s %s\n"%(c1[1],c1[3],c1[4],c1[5]))
filin.close()
Hors ligne
#48 Le 08/04/2015, à 05:01
- pingouinux
Re : AIDE sur le filtrage de données
Ici, tu recherches les lignes dont la valeur de la 2ème colonne est comprise entre 1200000 (incluse) et 1300000 (exclue).
import re
import string
#ouverture fichiers et fichier résultats
filin = open("test.txt","r")
lignes = filin.readlines()
filin.close()
resultat = open("resultat.txt","w")
#étape de recherche et stockage des résultats
for lig in lignes :
if re.match('GRID\s+12\d{5}\s',lig) :
c1 = lig.split()
print(c1)
resultat.write("%s %s %s %s\n"%(c1[1],c1[3],c1[4],c1[5]))
resultat.close()
Dernière modification par pingouinux (Le 08/04/2015, à 05:40)
Hors ligne
#49 Le 08/04/2015, à 07:26
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
Ouioui c'est voulue
Hors ligne
#50 Le 08/04/2015, à 07:32
- pingouinux
Re : AIDE sur le filtrage de données
Est-ce que le script en #48, qui est la version du tien en #47, mais indentée correctement, fait ce que tu veux ?
Hors ligne