将两个以空格分隔的文本文件按公共列处理

时间:2013-04-08 20:25:54

标签: perl

我有两个文本文件,如下所示:

col1 primary col3 col4
blah 1       blah  4
1    2       5     6
...

colA primary colC colD
1    1       7    27
foo  2       11   13

我想将它们合并到一个更宽的表中,例如:

primary  col1 col3 col4 colA colC colD
1        blah blah 4    a    7    27
2        1    5    6    foo  11   13

我对Perl很新,所以我不确定最好的方法是做什么。 请注意,列顺序无关紧要,并且有几百万行。我的文件很遗憾也没有排序。

我目前的计划,除非有替代方案: 对于其中一个文件中的给定行,扫描另一个文件以查找匹配的行,并根据需要将它们附加到新文件中。这听起来既缓慢又麻烦。

谢谢!

1 个答案:

答案 0 :(得分:-1)

  • 解决方案1。

    1. 使用标准的CPAN分隔文件解析器(如TXT::CSV_XS)逐行读取两个文件中较小的一个,以解析列。

    2. 将每条记录(作为列的arrayref)保存在哈希中,合并列为哈希键

    3. 完成后,使用标准CPAN分隔文件解析器(如TXT::CSV_XS)逐行读取两个文件中较大的一个,以解析列。

    4. 对于每条记录,找到连接键字段,从存储文件#1中的数据的哈希中找到匹配记录,根据需要合并2条记录,然后打印。

    5. 注意:由于整个较小的文件将存储在内存中,因此内存非常密集,但不会要求您阅读其中一个文件数百万次。


  • 解决方案2。

    1. 将file1(使用Unix sort或一些简单的Perl代码)排序到" file1.sorted"

    2. 将file2(使用Unix sort或一些简单的Perl代码)排序到" file2.sorted"

    3. 打开两个文件进行阅读。循环直到两者都被完全读取:

      • 如果该文件的缓冲区为空(缓冲区只是包含下一条记录的变量),则从每个文件中读取1行到缓冲区。

      • 比较2行之间的索引。

      • 如果index1< index2,将file1的记录写入输出(不合并)和空buffer1。重复步骤3

      • 如果index1> index2,将file2的记录写入输出(不合并)和空buffer2。重复。

      • 如果index1 == index2,合并2条记录,将合并后的记录写入输出并清空两个缓冲区(假设连接索引列是唯一的。如果不唯一,则此步骤更复杂)。

    4. 注意 NOT 要求您将整个文件保留在内存中,除了对文件进行排序(可以在内存中完成)如果你需要约束方式)。