0

我有一个 csv 文件,如下所示

1,1  
2,2  
3,4  
4,5  
6,6

如您所见,第 1 列缺少“5”,第 2 列缺少“3”。
我想编写一个脚本,允许我比较两列并插入“缺少值”。输出看起来像:

1,1  
2,2
3, value missing
4,4
value missing, 5
6,6  

任何帮助将不胜感激!
注意:我在示例中使用了数字,真正的问题是没有任何实际意义的字符串

编辑:我在下面包含了一个实际数据的样本

HM999993,HM999993  
HM999995,HM999995  
HM999997,HM999997  
J04353,J04353  
JF800658,JF834523  
JF834523,JF906559  
JF906559,JN171845  
JN171845,K02718  
JN709469,M12732  
JN709470,M12737  
JN709471,M14119  
JN709472,M17463  
JQ754321,M20219  
4

3 回答 3

2

这是一个使用整数的相当简单的任务。但是,使用字符串会更复杂。使用整数,您可以比较这两个数字,如果其中一个高于另一个,那么您就会知道存在缺失值。这种直截了当的比较不适用于字符串,除非它们按字母顺序排列并且您只有一个以每个字母开头的字符串。

如果您只是比较每个文件中的行数来确定丢失字符串的总数,那么您会遇到问题,以确定丢失的字符串来自哪个位置,如您的问题中所要求的那样。

于 2012-07-07T15:50:47.463 回答
1

需要进一步简化,但我想它有效:

#!/usr/bin/python
import csv

def navigation(iterable):
    iterator = iter(iterable)
    prev = None
    item = iterator.next()

    for next in iterator:
        yield (prev, item, next)
        prev = item
        item = next

    yield (prev, item, None)

with open('input.csv') as csv_input:
    with open('output.csv', 'w') as csv_output:
        old_data = []
        new_data = []

        for row in csv.reader(csv_input):
            old_data += row

        for index, (_prev, item, _next) in enumerate(navigation(old_data)):
            if _next != item:
                if _prev != item:
                    row = [item, 'missing value']
                    new_data.append(row if index % 2 == 0 else row[::-1])
            else:
                new_data.append([item, _next])

        writer = csv.writer(csv_output, delimiter=',', lineterminator='\n')
        writer.writerows(new_data)
于 2012-07-07T16:37:19.807 回答
0

在不知道每列中预期的完整字符串列表的情况下,我认为这无法解决。除此以外,

import csv

expected_in_A = set(['a','b','c','d'])
expected_in_B = set(['w','x','y','z'])

def main():
    with open('myfile.csv', 'rb+') as f:
        incsv = csv.reader(f)
        for row in incsv:
            expected_in_A.discard(row[0])
            expected_in_B.discard(row[1])

        # because the file opening mode included '+',
        # and because we have already read to the end of it,
        # we can now simply append to it:
        outcsv = csv.writer(f)
        outcsv.writerows([val, 'value missing'] for val in expected_in_A)
        outcsv.writerows(['value missing', val] for val in expected_in_B)

if __name__=="__main__":
    main()

如果myfile.csv包含

a,w
b,x
d,z

(在 z 之后有一个回车!)然后它变成

a,w
b,x
d,z
c,value missing
value missing,y
于 2012-07-07T16:49:26.353 回答