2017-07-28 5 views
-1

Ich habe eine Datei sucht auf diese Weise:Datensortierung, die Kombination von zwei Linien

;1;108/1;4, 109 
    ;1;51;4, 5 
    ;2;109/2;4, 5 
    ;2;108/2;4, 109 
    ;3;108/2;4, 109 
    ;3;51;4, 5 
    ;4;109/2;4, 5 
    ;4;51;4, 5 
    ;5;109/2;4, 5 
    ;5;40/6;5, 6, 7 

wo

;id1;id2;position_on_shelf_id2 
    ;id1;id3;position_on_shelf_id3 

als Ergebnis, ich will bekommen: id1, id2-ıd3; x wobei x sowohl gemeinsame Lagerpositionen für ID2 und iD3 sind, sollte es so

1;108/1-51;4 
    2;109/2-108/2;4 
    3;108/2-51;4 
    4;109/2-51;4, 5 
    5;109/2-40/6;5 

mein Skript Arbeit suchen Bis zu dem Moment, wo ich allgemeine Regalpositionen eingeben muss. Ich habe versucht mit .intersection, aber es funktioniert nicht richtig, wenn ich Positionen habe bestehend aus Doppel-Zeichen (pos: 144-Ergebnis: 14; pos: 551, Ergebnis: 51; pos: 2222-Ergebnis: 2 ie)

result = id2_chars.intersection(id3_chars) 

irgendwelche Fix für die Kreuzung? oder vielleicht eine bessere Methode für Sie?

Code bisher:

Part1 - fusioniert jede zweite Zeile zusammen

exp = open('output.txt', 'w') 
with open("dane.txt") as f: 
    content = f.readlines() 
    strng = "" 
    for i in range(1,len(content)+1): 
     strng += content[i-1].strip() 
     if i % 2 == 0: 
      exp.writelines(strng + '\n') 
      strng = "" 

exp.close() 

Part2 - Kreuzung: exp = open ('output2.txt', 'w')

imp = open('output.txt') 
for line in imp: 
    none, lp1, dz1, poz1, lp2, dz2, poz2 = line.split(';') 
    s1 = poz1.lower() 
    s2 = poz2.lower() 
    s1_chars = set(s1) 
    s2_chars = set(s2) 
    result = s1_chars.intersection(s2_chars) 
    result = str(result) 
    exp.writelines(lp1 + ';' + dz1 + '-' + dz2 + ';' + result + '\n') 
exp.close() 

** Ich habe das Ergebnis für meine Bedürfnisse noch nicht gefiltert (es ist in "Liste" Form), aber es wird kein Problem sein, sobald ich das richtige Ergebnis der Kreuzung

bekomme
+0

Bitte geben Sie den Code, den Sie bisher haben. – perigon

+0

Code hinzugefügt (einige Buchstaben) – krizz

Antwort

1

Ihr Hauptproblem besteht darin, dass Sie versuchen, 2 Zeichensätze zu schneiden, während Sie Positionen überschneiden sollten. Sie sollten also zumindest Gebrauch:

... 
s1 = poz1.lower() 
s2 = poz2.lower() 
s1_poz= set(x.strip() for x in s1.split(',')) 
s2_poz = set(x.strip() for x in s1.split(',')) 
result = s1_poz.intersection(s2_poz) 
result = ', '.join(result) 
... 

Aber in der Tat, man konnte die ganze Verarbeitung in einem einzigen Durchgang leicht tun:

exp = open('output.txt', 'w') 
with open("dane.txt") as f: 
    old = None 
    for line in f:    # one line at a time is enough 
     line = line.strip() 
     if old is None:   # first line of a block, just store it 
      old = line 
     else:     # second line of a bock, process both 
      none, lp1, dz1, poz1 = old.split(';') 
      none, lp2, dz2, poz2 = line.split(';') 
      poz1x = set(x.strip() for x in poz1.tolower().split(',')) 
      poz2x = set(x.strip() for x in poz2.tolower().split(',')) 
      result = ', '.join(poz1x.intersection(poz2x)) 
      exp.write(lp1 + ';' + dz1 + '-' + dz2 + ';' + result + '\n') 
      old = None 
+0

danke, ich fand gestern eine ähnliche Lösung auf eigene Faust – krizz