我有一个像下面那样的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
答案 0 :(得分:2)
使用整数这是一个相当简单的任务。但是,使用字符串会更复杂。使用整数,您可以比较两个数字,如果一个高于另一个,那么您就会知道存在缺失值。这种直接的比较不适用于字符串,除非按字母顺序排序,并且每个字母只有一个字符串。
如果您只是比较每个文件中的行数以确定缺失字符串的总数,那么您将遇到问题,根据您的问题中的要求确定缺少的字符串来自哪个位置。
答案 1 :(得分: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)
答案 2 :(得分: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