2013-09-21 5 views
0

나는 다음과 같은 형식이 개 CSV 파일 데 :파이썬은 두 개의 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| 

그래서 그들이 같은 경우에도, 나에게 세 번째를 표시하지 않습니다. 그것은 파일을 통해 좋은 iterating되지 않는 것 같습니다.

감사합니다.

+0

행이 시간순으로 정렬되어 있습니까? 또는 file1의 첫 번째 행에 해당하는 특정 날짜가 file2의 마지막 행에 있습니까 (아니면 전혀 표시되지 않습니까?) –

+0

타임 스탬프가 고유하면 타임 스탬프를 키로 사용하여 두 개의 dicts를 만들고 병합합니다. –

+0

@Ofir 예 행은 연대순으로 정렬됩니다 – 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

관련 문제