2013-09-21 187 views
0

我有下面的格式2個CSV文件:Python的比較兩個CSV文件,並且將數據追加到csv文件

首先是outputTweetsDate.csv:

Here is some text;13.09.13 16:45 
Here is more text;13.09.13 16:45 
And yet another text;13.09.13 16:46 

第二個文件是apiSheet.csv :

13.09.13 16:46;89.56 
13.09.13 16:45;90.40 

我想這兩個文件進行比較,如果兩個日期時間值匹配的文本和數據添加到一個新文件(finalOutput.csv):

|89.56|,|Here is some text| 
|89.56|,|Here is more text| 
|90.49|,|And yet another text| 

這是我的代碼,我到目前爲止有:

with open("apiSheet.csv", "U") as in_file1, open("outputTweetsDate.csv", "rb") as in_file2,open("finalOutput.csv", "wb") as out_file: 
    reader1 = csv.reader(in_file1,delimiter=';') 
    reader2 = csv.reader(in_file2,delimiter='|') 
    writer = csv.writer(out_file,delimiter='|') 
    for row1 in reader1: 
     for row2 in reader2: 
      if row1[0] == row2[1]: 
       data = [row1[1],row2[0]] 
       print data 
       writer.writerow(data) 

我修改了代碼,它現在的作品,到目前爲止,但它並不低谷遍歷所有代碼正確。 瞬間我的輸出是這樣的:

|89.56|,|Here is some text| 
|89.56|,|Here is more text| 

所以它不顯示我的第三個,即使它們是相同的。它似乎不是通過文件迭代。

謝謝!

+0

行是按時間順序排列的嗎?或者,file1中第一行對應的某個日期是否在file2的最後一行(或者根本沒有?) –

+0

如果時間戳是唯一的,我將使用timestamp作爲key併合並它們。 –

+0

@Ofir yes行按時間順序排列 – Max

回答

0

在讀取file1的第二行之前,您的第二個循環到達file2(outputTweetsDate.csv)的末尾。

試試這個片斷:

with open("apiSheet.csv", "U") as in_file1, open("outputTweetsDate.csv", "rb") as in_file2,open("finalOutput.csv", "wb") as out_file: 
    reader1 = csv.reader(in_file1,delimiter=';') 
    reader2 = csv.reader(in_file2,delimiter='|') 
    writer = csv.writer(out_file,delimiter='|') 
    row2 = reader2.next() 
    for row1 in reader1: 
     while row2 and row1[0] <= row2[1]: 
      if row1[0] == row2[1]: 
       data = [row1[1],row2[0]] 
       print data 
       writer.writerow(data) 
      row2 = reader2.next() 

編輯 逆順序是棘手。讓我們停止嘗試變得聰明,並做一些暴力。它會毫無問題地工作,因爲這些文件遠不如你的RAM。

with open("apiSheet.csv", "U") as in_file1, open("outputTweetsDate.csv", "rb") as in_file2,open("finalOutput.csv", "wb") as out_file: 
    reader1 = csv.reader(in_file1,delimiter=';') 
    reader2 = csv.reader(in_file2,delimiter='|') 
    writer = csv.writer(out_file,delimiter='|') 

    rows2 = [row for row in reader2] # all the content of file2 goes in RAM. 
    for row1 in reader1: 
     for row2 in rows2: 
      if row1[0] == row2[1]: 
       data = [row1[1],row2[0]] 
       print data 
       writer.writerow(data) 
+0

完成了該操作。我該如何解決這個問題? – Max

+0

嘿,在最後一行它應該是「row2 = reader2.next()」對不對?它只適用於改變apiSheet.csv的順序,現在它降序並且你的代碼以升序值工作。我該如何解決這個問題? – Max

+0

Sry我的代碼片段未被調試。你說的最後一行是對的。爲了使它與降序值一起工作,只需在這段時間內改變測試。這是一個字符串比較,所以用字符串表示日期,如果row1的日期在row2的日期之後,那麼row1比row2大。 對於降序,使用測試 row1 [0] <= row2 [1] 我將編輯我的迴應以反映這些更改。 – jacquarg