【问题标题】:Process two space delimited text files into one by common column [duplicate]按公共列将两个空格分隔的文本文件处理为一个[重复]
【发布时间】:2013-04-08 20:25:53
【问题描述】:

我有两个看起来像这样的文本文件:

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 很陌生,所以我不确定最好的方法是什么。 请注意,列顺序无关紧要,有几百万行。不幸的是,我的文件没有排序。

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

谢谢!

【问题讨论】:

  • 此数据应在数据库中。
  • @Borodin 就是这样。我正在制作一个用于批量插入的文件。
  • @AlexQueue:那么您应该在将这些表放入数据库之后进行关联。只需创建并填充作为此信息副本的两个表,然后执行 JOIN。

标签: perl


【解决方案1】:
  • 解决方案 1。

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

    2. 将每条记录(作为列的数组引用)保存在哈希中,合并列是哈希键

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

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

    注意:这会占用大量内存,因为整个较小的文件将驻留在内存中,但不需要您读取其中一个文件数百万次。


  • 解决方案 2。

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

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

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

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

      • 比较两行之间的索引。

      • 如果 index1

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

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

    注意:这确实要求您将整个文件保存在内存中,除了对文件进行排序(可以在内存中完成)如果需要,可以采用受限方式)。

【讨论】:

  • 投反对票是因为...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多