2

我正在尝试搜索 csv 文件中特定列中的所有行,以查看它们是否包含另一个 csv 文件中的字符串。如果它们包含该字符串,我想将相应的值写入另一个特定列。

例如文件1:

Search Value,Location
UK,United Kingdom
United Kingdom,United Kingdom
United States,United States
Hong Kong,Hong Kong
Florida,"Florida, United States"

和文件2:

Name,Default,Geo Location
DRE UK,,
Production United States,,
Development Hong Kong,,
United Kingdom Sales,,
Florida Marketing,,

我想查找文件 2 中的名称包含文件 1 中搜索值的字符串的行,然后将文件 1 中位置的相应值写入文件 2 中的地理位置。所以结果是这样的:

Name,Default,Geo Location
DRE UK,,United Kingdom
Production United States,,United States
Development Hong Kong,,Hong Kong
United Kingdom Sales,,United Kingdom
Florida Marketing,,"Florida, United States"

我一直在寻找答案,我遇到了遍历一个 csv 文件的行以在另一个 csv 文件中查找相应数据的情况。我基于此开始了代码,但我不知道这是否是正确的,我被卡住了。

import csv

file1reader = csv.reader(open('file1.csv','rb'))
file2reader = csv.reader(open('file2.csv','rb'))
writer=csv.writer(open('file3.csv','wb'))

header1 = file1reader.next() #header
header2 = file2reader.next() #header


for Search Value, Location in file1reader:
    for Name, Default, Geo Location in file2reader:
        if Search Value in Name: # found it

提供的数据是我想做的一个例子。实际文件会很大,所以请记住这一点。

任何帮助表示赞赏。

编辑

如果我想在最终输出 (file3.csv) 中包含与条件不匹配的 file2.csv 中的原始行,我该怎么做?

例如,如果 file2 是这样的,我也希望包含不匹配的行:

Name,Default,Geo Location
DRE UK,,
Production United States,,
Development Hong Kong,,
United Kingdom Sales,,
Florida Marketing,,
Stuff,,Somewhere
More Stuff,,
4

2 回答 2

1

DictReader这是一个使用andDictWriter类的简单示例:

from csv import DictReader, DictWriter

with open('file1.csv') as fin1,\
     open('file2.csv') as fin2,\
     open('file3.csv', 'wb') as fout:

    reader1 = DictReader(fin1)
    reader2 = DictReader(fin2)

    writer = DictWriter(fout, fieldnames=reader2.fieldnames)
    writer.writeheader()

    for line2 in reader2:
        outline = dict(line2)
        fin1.seek(0) # resets the reader1 iterator
        for line1 in reader1:
            if line1['Search Value'] in line2['Name']:
                outline['Geo Location'] = line1['Location']
        writer.writerow(outline)

这个算法的复杂度是 O(n 2 ),所以,就像@maged指出的那样,它不是很有效。

于 2013-07-09T21:05:14.390 回答
0

你的解决方案是正确的。

另一个解决方案是将文件加载到内存中,以哈希表/字典结构的形式提高性能(避免 O(n^2))。但是,由于您正在处理大文件,并且您没有进行完全匹配,因此它会使该解决方案不太理想。

您还可以尝试将文件加载到哈希表结构,并将其写入文件,以避免内存错误(类似于搜索索引器)。不过,这对于您想要做的事情似乎有点过头了。

于 2013-07-09T20:02:18.300 回答