2017-07-28 11 views
-1

を組み合わせ、並べ替え:結果としてデータは、私はこの方法を探して、ファイル持っている2行

;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 

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

を、私は取得したい: ID1、ID2、ID3; X をここで、xはid2とid3の共通シェルフ位置です。これは次のようになります。

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 

my script work私は共通の棚の位置を入力する必要がある瞬間まで罰金。私は交差点を使用しようとしましたが、二重の文字(ポジション:144-結果:14、ポジション:551、結果:51、ポジション:2222-結果:2 ie)を持つポジションを持っていると正しく動作しません。

result = id2_chars.intersection(id3_chars) 

交差点の修正はありますか?あなたの心にはもっと良い方法がありますか?これまで

コード:

その1 - すべての2番目の行をマージ一緒

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() 

その2 - 交差点: EXP =オープン( '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() 

**私のニーズに合った結果はまだフィルタリングされていませんでしたが(「リスト」形式ですが)、正しい交差結果が得られたら問題にはなりません

+0

これまであなたが持っているコードを含めてください。 – perigon

+0

コードを追加しました(何文字か) – krizz

答えて

1

あなたの主な問題は、あなたが位置を交差する必要がある間に2組の文字を交差しようとすることです。だから、少なくとも使用する必要があります

... 
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) 
... 

しかし、実際には、あなたは簡単に1回のパスで全体の処理を行うことができます:

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

ありがとうございました。 – krizz

関連する問題