Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 01/04/2015, à 14:35

ichigo33kurosaki

Re : AIDE sur le filtrage de données

Merci @Postmortem sa marche super big_smile: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, à 09: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, à 10: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, à 10:35)

Hors ligne

#29 Le 02/04/2015, à 20: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, à 20: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, à 14: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, à 22:23

pingouinux

Re : AIDE sur le filtrage de données

Bonsoir,

benji1525 #31 a écrit :

savez vous si ces méthodes peuvent être réalisées en python??

Oui… smile

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, à 09:56)

Hors ligne

#33 Le 07/04/2015, à 19: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, à 19: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, à 21: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, à 22:17)

Hors ligne

#36 Le 07/04/2015, à 22: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, à 22: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, à 22:36)

Hors ligne

#38 Le 07/04/2015, à 22: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, à 22: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, à 22: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, à 22: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, à 22: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, à 23: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, à 23: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, à 23: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, à 23: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, à 23: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, à 06: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, à 06:40)

Hors ligne

#49 Le 08/04/2015, à 08:26

ichigo33kurosaki

Re : AIDE sur le filtrage de données

Ouioui c'est voulue

Hors ligne

#50 Le 08/04/2015, à 08: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