2016-03-09 22 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

相关问题