数据排序,结合2行

时间:2017-07-28 07:13:10

标签: python text-files

我有一个看起来像这样的文件:

    ;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

我的脚本工作正常,直到我需要键入常见的货架位置。我尝试使用.intersection,但是当我的位置由双字符组成时,它不能正常工作(pos:144-result:14; pos:551,result:51; pos:2222-result:2 ie)

result = id2_chars.intersection(id3_chars)

交叉点的任何修复?或者你心中可能有更好的方法吗?

到目前为止

代码:

part1 - 将每一行合并在一起

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

**我没有按照我的需要过滤结果(它是“列表”形式),但一旦我得到正确的交叉结果就不会有问题

1 个答案:

答案 0 :(得分: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)
...

但事实上,你可以在一次通过中轻松完成整个处理:

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