2012-03-05 16 views
4

相應的數據我得到了一個有趣的問題:遍歷一個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擁有1100萬行這樣的:

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 

我想要做的是寫一個腳本,需要每個DTIME值file1.csv,發現在file2.csv的DateTime列部分匹配的第一個實例,以及輸出Dat eTime,Bid,Ask for the row。部分匹配是前16個字符。

這兩個文件都是從最舊到最新排序的,所以如果file1.csv中的「2010-12-26 17:01」匹配了file2.csv中的4個條目,我只需要提取第一個文件:「2010-12 -26 17:01:01「

不確定如何繼續..我試過一本字典,但值的順序很重要,所以我不確定這是否可行。也許把file1的DTime列放入一個列表中,並且爲該列表中的每個條目搜索file2中的DateTime?

謝謝你們

+0

這個問題是不太有趣,如果你把它扔進一個數據庫,並做一個加入;) – YXD 2012-03-05 09:34:28

+0

我試圖訪問和MySQL的數據庫方法,但遇到了試圖離開加入兩個表的問題。運行速度很快的唯一sql查詢是SELECT TOP 1 DateTime,Bid,Ask FROM tblTicks WHERE(DateTime)LIKE'2010-12-26 17:01 *';當我試圖用第一個表進行任何迭代時,它會凍結..儘管python可以更好地處理它.. – user1249464 2012-03-05 09:57:18

+0

使用通配符執行字符串搜索肯定會很慢。 Id建議數據庫方法,以便您有足夠的時間和資源進行正確遷移。選擇索引時請考慮這些緩慢的查詢。 – Droogans 2012-03-06 13:15:46

回答

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 
+0

這幾乎奏效!它實際上發現我的數據在file2中存在問題。當查找「2010-01-06 20:00」時,它沒有找到它..而是file2中的附近值是「2010-01-06 19:59:20」和「2010-01-06 20: 01:14「 - 理想情況下,我會採取序列中的下一個,20:01:14。 「日期時間」課程在這裏是否需要? – user1249464 2012-03-05 10:27:58

+0

你可以驗證'如果DateTime.startswith(DTime):'只需要更改爲'如果DateTime> = DTime:'這似乎實際上這樣做。 – user1249464 2012-03-05 10:54:34

+0

@ user1249464:'datetime'似乎是合乎邏輯的。查看編輯。 – Avaris 2012-03-05 10:55:13

1

您可以創建一個字典從文件2,這裏的關鍵是你想要的時間前綴,和值是第一行,或匹配這個前綴的所有行。 那麼它只是在做類似的事情:

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

除非你只需要做一次,你應該真的使用一個數據庫。向table2中添加一列,其中包含DATETIME而不包含秒,以便您可以加入精確匹配,而不是LIKE。

如果您對這些列進行索引,它會更快,甚至更快。如果您還可以將file1.csv存儲在數據庫中,則不需要迭代:您可以在單個選擇查詢中獲得整組結果。這是SQL的一種東西。

PS。如果您決定採取這種方法,您可以向查詢尋求幫助。

相關問題