循环遍历一个csv文件的行以在另一个csv文件中查找相应的数据

时间:2012-03-05 09:30:49

标签: python csv

我遇到了一个有趣的问题:

file1.csv有几百行,如:

Code,DTime
1,2010-12-26 17:01
2,2010-12-26 17:07
2,2010-12-26 17:15

file2.csv有大约1,100万行,如:

id,D,Sym,DateTime,Bid,Ask
1375022797,D,USD,2010-12-26 17:00:15,1.311400,1.311700
1375022965,D,USD,2010-12-26 17:00:56,1.311200,1.311500
1375022984,D,USD,2010-12-26 17:00:56,1.311300,1.311600
1375023013,D,USD,2010-12-26 17:01:01,1.311200,1.311500
1375023039,D,USD,2010-12-26 17:01:02,1.311100,1.311400
1375023055,D,USD,2010-12-26 17:01:03,1.311200,1.311500
1375023063,D,USD,2010-12-26 17:01:03,1.311300,1.311600

我要做的是编写一个脚本,该文件获取file1.csv中的每个DTime值,并在file2.csv的DateTime列中找到部分匹配的第一个实例,并输出DateTime,Bid,Ask for那一排。部分匹配在前16个字符上。

这两个文件都是从最旧到最新排序的,所以如果file1.csv中的“2010-12-26 17:01”匹配file2.csv中的4个条目,我只需要提取第一个:“2010-12- 26 17:01:01“

不确定如何继续..我尝试了字典,但值的顺序很重要,所以我不确定这是否有效。也许将file1的DTime列放入列表中,对于该列表中的每个条目,在file2中搜索DateTime?

谢谢你们

3 个答案:

答案 0 :(得分:6)

如果您没有重复的DTime值,则应该有效:

import csv

file1reader = csv.reader(open("file1.csv"), delimiter=",")
file2reader = csv.reader(open("file2.csv"), delimiter=",")

header1 = file1reader.next() #header
header2 = file2reader.next() #header

for Code, DTime in file1reader:
    for id_, D, Sym, DateTime, Bid, Ask in file2reader:
        if DateTime.startswith(DTime): # found it
            print DateTime, Bid, Ask   # output data
            break                      # break and continue where we left next time

修改

import csv
from datetime import datetime

file1reader = csv.reader(open("file1.csv"), delimiter=",")
file2reader = csv.reader(open("file2.csv"), delimiter=",")

header1 = file1reader.next() #header
header2 = file2reader.next() #header

for Code, DTime in file1reader:
    DTime = datetime.strptime(DTime, "%Y-%m-%d %H:%M")
    for id_, D, Sym, DateTime, Bid, Ask in file2reader:
        DateTime = datetime.strptime(DateTime, "%Y-%m-%d %H:%M:%S")
        if DateTime>=DTime: # found it
            print DateTime, Bid, Ask   # output data
            break                      # break and continue where we left next time

答案 1 :(得分:3)

除非你只需要这样做一次,否则你应该真正使用数据库。向table2添加一个包含DATETIME而没有秒的列,这样您就可以加入完全匹配,而不是LIKE。

如果您索引这些列,它会很快,甚至更快。如果您也可以将file1.csv存储在数据库中,则不需要迭代:您可以在单个选择查询中获取整个结果集。这就是SQL的用途。

PS。如果您决定采用这种方法,可以向查询寻求帮助。

答案 2 :(得分:1)

您可以从file2创建一个字典,其中键是您想要的时间的前缀,该值是第一行或与此前缀匹配的所有行。 那么这只是做一些事情的事情:

entries = file2Dict.get(file1Entry)
if entries:
   print  "First entry is %s" entries[0]