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.

#1 Le 13/04/2013, à 19:09

A.

[abandon] Traitement d'un fichier

Bonjour,

J'ai un fichier texte de la forme suivante :

Num1 Num2 Chaine1 Chaine2 (Chaine3) Num3

Un exemple simplifié pour que ce soit plus clair :

1 0 Dessin (Rouge) 0
2 0 Dessin de mauvais goût (Bleu) 1
3 1 Peinture à l'huile réussie (Orange) 1

Chaque chaine est associée à un entier (Num_Chaine).

J'aimerais garder la structure du fichier, mais le réordonner en fonction de la valeur Num_Chaine1 + Num_Chaine2 + Num_Chaine3.

Il y a quelques cas particuliers :
- la Chaine2 n'est pas systématique.
- il existe un ou deux éléments de la Chaine1 qu'on peut trouver dans la Chaine2

Je dispose d'une BDD donnant l'association entre chaine et entier :

Contenu possible de Chaine1 :
Dessin (appartient à la famille1, vaut 1)
Peinture à l'huile (appartient à la famille2, vaut 5)
Esquisse au crayon (appartient à la famille1, vaut 2)
Planche de BD (appartient à la famille1, vaut 3)

Contenu possible de Chaine2 :
Réussi (vaut 5)
Prometteur (vaut 3)
de mauvais goût (vaut 0)
Dessin (vaut 1)

Contenu possible de Chaine3 : (pour chaque famille, la 1ère valeur vaut 10, la 2ème 20 et la 3ème 30).
Famille1 : Rouge, Bleu, Vert (chaine associée uniquement à un élément de la famille1)
Famille2 : Orange, Cyan, Jaune (chaine associée uniquement à un élément de la famille2)

L'exemple donnerait donc :

2 0 Dessin de mauvais goût (Bleu) 1 / vaut 21
3 1 Peinture à l'huile réussie (Orange) 1 / vaut 20
1 0 Dessin (Rouge) 0 / vaut 11

Est-ce que la BDD doit contenir l'ensemble des combinaisons possibles ?
Doit--on séparer la BDD en 3 fichiers (Chaine1, Chaine2, Chaine3) ou un seul suffit ?
Est-ce qu'on peut s'en sortir avec un script en bash ?

La structure de la BDD est complétement modifiable pour simplifier le script.

Dernière modification par A. (Le 14/04/2013, à 18:46)

Hors ligne

#2 Le 13/04/2013, à 23:28

nesthib

Re : [abandon] Traitement d'un fichier

En python :

#!/usr/bin/env python

import re

regex=re.compile('''([0-9]) ([0-9]) (Dessin|Peinture à l'huile|Esquisse au crayon|Planche de BD) (réussie?|prometteu(?:r|se)|de mauvais goût)? ?\((Rouge|Bleu|Vert|Orange|Cyan|Jaune)\) ([0-9])''')

with open('fichier.txt') as f:
    lignes = f.readlines()
    for ligne in lignes:
        try:
            tokens = regex.findall(ligne)[0]
            print(tokens)
        except IndexError:
            print('Erreur de syntaxe')

Une fois que tu as isolé ces paramètres tu peux faire les calculs que tu veux dessus, par exemple en utilisant des dictionnaires :

valeurs_type = {'Dessin':1, "Peinture à l'huile":2, 'Esquisse au crayon':3, 'Planche de BD':4}
(num1, num2, type_oeuvre, qualite, couleur, num3)=regex.findall(ligne)[0]
print("Valeur de l'œuvre : %s" % valeurs_type[type_oeuvre])

NB. si l'information contenue dans chaque ligne devient plus complexe (plus de types, plus de valeurs possibles) Il faudra écrire un parseur plutôt que d'utiliser de simples expressions rationnelles.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 14/04/2013, à 18:54

A.

Re : [abandon] Traitement d'un fichier

Merci, la séparation des chaines a l'air de bien fonctionner.
Cependant, je laisse l'idée de ce script de côté. Je me rends compte que je pourrai me débrouiller autrement et plus simplement..
Dans mon cas, les Chaine1, 2 et 3 sont en fait constituées de plusieurs centaines d'éléments et il faudrait vérifier et adapter plusieurs choses avant de pouvoir séparer les chaines.

Merci en tout cas.

Hors ligne

#4 Le 14/04/2013, à 21:19

nesthib

Re : [abandon] Traitement d'un fichier

Avec plusieurs centaines d'éléments les expressions rationnelles ne seront pas une bonne solution et il faut passer par un analyseur syntaxique. Tu dois analyser ta chaîne mot par mot pour trouver ses constituants. Dans ton cas tu attends deux nombres, puis une chaîne de caractère, puis une chaîne entre parenthèses, puis…

Tu peux aussi coupler les deux. Utiliser l'expression rationnelle pour découper les éléments sans a priori (nombre, nombre, chaîne, (chaîne)…) et analyser à la suite les chaînes.


Par curiosité, c'est quoi ton projet ?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne