2016-03-09 84 views
-1

我有兩個文本文件。他們包含約75,000(說file1)和550,000(說file2)線。文件實際上以逗號分隔csv格式。快速處理另一個文件中每行一個文件的每行

我需要從file1到file2中的行以一對多的關係匹配(所以我不能停止處理在第一次找到的匹配)。另外file1中的不同行可能在file2中有相同的匹配(所以我無法從file2中刪除已經匹配的行)。

我試過簡單的嵌套for循環,但它需要大量的時間來匹配這些。我想過關於生成器,但這裏不是一個例子,因爲我需要多次遍歷file2。 有沒有辦法讓它變快?

Upd。文件的順序無關緊要。我從file1中讀取行,將其分割以獲得一些字段,並與來自file2的普通字段進行比較。如果匹配,我會添加幾個字段從file2列出進一步的行動。

+0

幾個澄清問題:1)你關心文件中的行的順序?即在執行比較之前排序兩個文件是否存在問題? 2)你比較「整條線對整條線」還是「線條對比線」? – Yaron

+1

我會將數據讀入數據庫。 RDBMS在這種比較中速度非常快。但是,如果你想在Python中做到這一點,可以考慮給出一個最小和完整的例子。 – roadrunner66

回答

1

如果這兩個文件的匹配行順序不同,例如,如果file1中的第一行與file2中的最後一行匹配,那麼除了讀取一行之外,沒有其他方法可以執行所需操作文件存入內存。您可以閱讀它以查找匹配項,例如dict以使其能夠找到匹配O(1)中的行。

您能否提供兩個簡短的示例文件來理解匹配規則?然後我會嘗試爲此編寫一些代碼。


UPDATE

既然你只提供了兩個文件,兩行而不是,我試圖用我的想象。

我已經創建了兩個文件,用下面的代碼:

#!/usr/bin/python3.5 

import random 
with open('file1', 'w') as f1, open('file2', 'w') as f2: 
    for _ in range(10): 
     f1.write('{},{},{},{},track-{}\n'.format(*[random.randrange(5) for x in range(5)])) 
     f2.write('stage-{},{},{},{},{}\n'.format(*[random.randrange(5) for x in range(5)])) 

文件1:

4,4,3,1,track-0 
3,1,0,2,track-0 
1,2,3,1,track-3 
0,1,2,1,track-2 
0,0,4,2,track-2 
0,2,3,1,track-0 
0,4,4,0,track-0 
2,1,4,3,track-1 
2,1,4,1,track-1 
1,1,0,3,track-4 

文件2:

stage-0,3,1,1,0 
stage-3,2,1,0,1 
stage-1,2,4,3,3 
stage-0,4,0,1,3 
stage-3,4,3,3,3 
stage-0,0,3,2,1 
stage-2,2,1,3,4 
stage-4,3,1,0,3 
stage-1,1,4,1,2 
stage-3,0,1,3,4 

接着,下面的代碼:

import re 

d, regex = {}, re.compile('stage-(\\d+)') 
with open('file2') as f2: 
    for line in f2: 
     value = int(regex.match(line).group(1)) 
     if value not in d: d[value] = [] 
     d[value].append(line[:-1]) 

regex = re.compile('.*track-(\\d+)') 

with open('file1') as f1: 
    for line in f1: 
     value = int(regex.match(line).group(1)) 
     print(line[:-1]) 
     if value not in d: print(' no matches') 
     else: 
      for x in d[value]: print(' MATCH: ' + x) 

提供了以下的輸出:

4,4,3,1,track-0 
    MATCH: stage-0,3,1,1,0 
    MATCH: stage-0,4,0,1,3 
    MATCH: stage-0,0,3,2,1 
3,1,0,2,track-0 
    MATCH: stage-0,3,1,1,0 
    MATCH: stage-0,4,0,1,3 
    MATCH: stage-0,0,3,2,1 
1,2,3,1,track-3 
    MATCH: stage-3,2,1,0,1 
    MATCH: stage-3,4,3,3,3 
    MATCH: stage-3,0,1,3,4 
0,1,2,1,track-2 
    MATCH: stage-2,2,1,3,4 
0,0,4,2,track-2 
    MATCH: stage-2,2,1,3,4 
0,2,3,1,track-0 
    MATCH: stage-0,3,1,1,0 
    MATCH: stage-0,4,0,1,3 
    MATCH: stage-0,0,3,2,1 
0,4,4,0,track-0 
    MATCH: stage-0,3,1,1,0 
    MATCH: stage-0,4,0,1,3 
    MATCH: stage-0,0,3,2,1 
2,1,4,3,track-1 
    MATCH: stage-1,2,4,3,3 
    MATCH: stage-1,1,4,1,2 
2,1,4,1,track-1 
    MATCH: stage-1,2,4,3,3 
    MATCH: stage-1,1,4,1,2 
1,1,0,3,track-4 
    MATCH: stage-4,3,1,0,3 

不知道這是你想要的,但我試圖創建大文件,具有75K和550K線,並花了3秒鐘生成他們只有一半秒解析(沒有時間的控制檯輸出,花了幾分鐘,並通過評論print s關閉)

+0

來自file1的行:3918,22162,7566537,1,track-30647 來自file2的行:stage-763085,59.962689,30.408465,0,0。00 匹配字段是line1中的最後一個,並且是line2中的第一個。 – selotec

+0

我是否正確理解track-12345與stage-12345匹配? – Grief

+0

在這個特定的行不,所以這是一個不匹配的行的例子。 – selotec

相關問題