2017-05-14 38 views
1

我有兩個.csv文件。一個有info1,另一個有info2。文件看起來像這樣
文件1:檢查csv文件是否有相同的項目

20170101,,,d,4,f,SWE 
20170102,a,,,d,f,r,RUS <- 

文件2:

20170102,a,s,w,,,,RUS <- 
20170103,d,r,,,,FIN 

我想這兩條線相結合(標記爲 「< - 」),並聯合一行:

20170102,a,s,w,d,f,r,RUS 

我知道我可以做類似這樣的腳本:

for row1 in csv_file1: 
    for row2 in csv_file2: 
     if (row1[0] == row2[0] and row1[1] == row2[1]): 
      do something 

是否有任何其他方法來找出哪些行在開始時有相同的項目,或者這是唯一的方法?這是找出相似之處的非常緩慢的方式,並且需要幾分鐘才能在100 000行文件上運行。

+0

我會建議合併文件,然後按前兩列排序而不是嵌套循環 –

+0

哪些列使行匹配?它只是第一列(所以,例如,RUS將不會有20170101)或組合?另外,訂單是否重要? – tdelaney

+0

一行中有35個項目。項目0-4在兩個文件中,5-9在文件1中,10-20在文件2中,21-34在兩者中。 – tmi12

回答

3

您的實施是O(n^2),比較一個文件中的所有行與另一個文件中的所有行。更糟糕的是,如果重新讀取第一個文件中每行的第二個文件。

您可以通過從第一個文件的內容構建索引來顯着提高速度。索引可以像字典一樣簡單,文件的第一列作爲關鍵字,行作爲值。 您可以在第一個文件上一次構建該索引。 然後在第二個文件上進行一次傳遞,如果該ID在索引中,則檢查每一行中的 。 如果是,則打印合並的線。

index = {row[0]: row for row in csv_file1} 

for row in csv_file2: 
    if row[0] in index: 
     # do something 

特別感謝@martineaudict comprehension版本建立索引。

如果可以有多個項目在第一個文件相同的id, 那麼股指可能指向這些行的列表:

index = {} 
for row in csv_file1: 
    key = row[0] 
    if key not in index: 
     index[key] = [] 
    index[key].append(row) 

這可以通過使用defaultdict簡化了一下:

from collections import defaultdict 

index = defaultdict(list) 
for row in csv_file1: 
    index[rows[0]].append(row) 
+1

感謝@馬蒂奧,發現! (已更新信息給您的帖子) – janos

+0

有多個項目有相同的日期(=行中的第一項),這是行不通的。 – tmi12

+0

@ tmi12你忘了在提問中提到: - /我更新了我的答案來處理這種情況。 – janos

相關問題