#1 Le 03/06/2014, à 12:32
- certes
cherche reseau de valeur dans fichier txt
Bonjour,
un partir d'un fichier txt qui s'appelerait info.txt et qui contiendrait ce type d'information :
fia__14 -- fia__28;
fia__14 -- wia_276;
fia__14 -- wia_282;
fia__14 -- Yia_285;
Yia__27 -- fia__28;
Yia__27 -- fia__29;
Yia__27 -- Yia__67;
fia__29 -- fia__48;
fia__29 -- Yia__67;
Yia__34 -- fia__35;
Yia__34 -- wia__38;
Yia__34 -- Yia__37;
Yia__34 -- fia__48;
fia__35 -- wia__38;
fia__35 -- fia__48;
Yia__37 -- wia__38;
fia__48 -- Yia__67;
wia__52 -- Yia__95;
wia__52 -- Yia_110;
Yia__67 -- wia_121;
Yia__92 -- Yia_137;
Yia__92 -- wia_171;
Yia_110 -- wia_144;
wia_121 -- Yia_130;
fia_128 -- fia_315;
Yia_137 -- wia_171;
wia_177 -- fia_196;
wia_177 -- fia_230;
wia_177 -- wia_233;
fia_196 -- fia_230;
fia_196 -- wia_233;
Yia_201 -- Yia_210;
Yia_201 -- fia_246;
Yia_201 -- wia_276;
Yia_201 -- Yia_285;
Yia_210 -- wia_255;
Yia_210 -- fia_246;
fia_218 -- wia_255;
fia_230 -- wia_233;
fia_246 -- Yia_275;
Yia_275 -- wia_276;
wia_276 -- wia_282;
wia_276 -- Yia_285;
wia_282 -- Yia_285;
je souhaiterais isoler l'ensemble des valeurs qui sont liées à une valeur précise
par exemple si je cherche Yia__92 dans les lignes qui précède je retrouverais les ligne suivantes
Yia__92 -- wia_171;
Yia_137 -- wia_171;
Yia__92 -- Yia_137;
donc ici je trouve tous ceux qui sont liés avec Yia__92
c'est à dire wia_171 et Yia_137
et puis je cherche ceux qui sont liés à wia_171 outre Yia__92
et je retrouve Yia_137
puis je recherche Yia_137 et je n'en trouve plus d'autre => fin d'analyse = valeurs inscrite dans un nouveau fichier
si je cherche wia_177 je trouve
wia_177 -- fia_196;
wia_177 -- fia_230;
wia_177 -- wia_233;
fia_196 -- fia_230;
fia_196 -- wia_233;
fia_230 -- wia_233;
etc ...
j'imagine qu'il y a moyen de faire un script qui automatiserait cela ... quelqu'un peut il m'aider ?
pensez vous possible d'en faire une variante en perl ?
D'avance
Hors ligne
#2 Le 03/06/2014, à 14:43
- pingouinux
Re : cherche reseau de valeur dans fichier txt
Bonjour,
Voici le script recherche.py, en python3, qui devrait convenir (les lignes en sortie ne sont pas dans l'ordre initial) :
#!/usr/bin/python3
# ./recherche.py val
import sys, re
val=sys.argv[1]
rec=re.compile('(.+_[0-9]+) +-- +(.+_[0-9]+);')
with open('fichier.txt','r') as f :
liste=[]
dico={}
for lig in f :
k=rec.match(lig)
if k :
kg1=k.group(1)
kg2=k.group(2)
liste.append([kg1,kg2])
dico[kg1]=dico.setdefault(kg1,[])
dico[kg2]=dico.setdefault(kg2,[])
dico[kg1].append(lig)
dico[kg2].append(lig)
vals=set(); resul=set(); l_vals0=0
while True :
for k in liste :
if val in k :
vals|=set(k)
liste.remove(k)
l_vals=len(vals)
if l_vals==l_vals0 : break
l_vals0=l_vals
for v in vals :
resul|=set(dico[v])
for lig in resul : print(lig[:-1])
À appeler ainsi
./recherche.py valeur_a_chercher
Par exemple
$ ./recherche.py Yia__92
Yia__92 -- wia_171;
Yia__92 -- Yia_137;
Yia_137 -- wia_171;
Remarque : Le script est aussi compatible avec python2
Dernière modification par pingouinux (Le 03/06/2014, à 14:48)
Hors ligne
#3 Le 04/06/2014, à 12:49
- certes
Re : cherche reseau de valeur dans fichier txt
trop fort !
testé et approuvé et validé !
super merci à toi pinguouinux !!!
PS: au cas ou, si jamais quelqu'un peut proposer une variante perl je suis toujours preneur.
Hors ligne