2013-07-09 123 views
1

我正在嘗試搜索csv文件中特定列中的所有行,以查看它們是否包含另一個csv文件中的字符串。如果它們包含該字符串,我想將相應的值寫入另一個特定的列。基於另一個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" 

和file2:

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

我想找到其中來自file2的名稱包含file1中搜索值的字符串行,然後寫在相應的值file1中的位置到file2中的地理位置。所以,結果是這樣的:

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" 

我一直在尋找一個答案,我整個loop through rows of one csv file to find corresponding data in another來了。我基於此開始了代碼,但我不知道這是否正確,我被卡住了。

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,我會怎麼做呢?

例子,如果文件2是這樣,而不是,我想也包括非匹配行:

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

您的文件是否已分類?基於代碼的答案假定兩個文件都按同一個鍵排序。這對於過去有效的方法來說是必要的! – llb

回答

1

以下是使用DictReaderDictWriter類的簡單示例:

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 ),所以,像@maged被指出,它不是很有效。

+0

謝謝!這工作得很好。 – CircuitB0T

+0

我如何包含file2.csv中沒有從Search Value中的Name字符串的行?就像是否有其他行與搜索不匹配一樣,我希望它們包含它們在file3.csv中的樣子?我試圖修改它來做到這一點,但效果並不理想。 – CircuitB0T

+0

我會在原文中編輯我的意思。 – CircuitB0T

0

你的解決方案是正確的。

另一個解決方案是將內存加載到散列表/字典結構中以提高性能(避免O(n^2))。但是,由於您正在處理大型文件,並且沒有完全匹配,所以它會使此解決方案不夠理想。

您也可以嘗試將文件加載到散列表結構,並將其寫入文件以避免內存錯誤(類似於搜索索引器)。這似乎對你想要做的事情有點矯枉過正。

+0

但是,如何完成代碼並將位置寫入地理位置以匹配線? – CircuitB0T

+0

假設你正在將它寫入file3中: writer.writerow [name,'',Search_Value] – maged

+0

在每個循環中都有這樣的情況,如果沒有找到Search_Value的值,另外寫一個標題給作者開頭 – maged

相關問題