2013-09-21 147 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