【问题标题】:Parsing and adding lines to a text file with some fields from another file使用来自另一个文件的某些字段解析文本文件并将其添加到文本文件中
【发布时间】:2010-02-17 00:34:21
【问题描述】:

我有 2 个文件,一个是主文件,另一个是这个文件的子集,还有一些附加数据。这两个文件都是带有 ^A 分隔符的字段形式。我的工作是从主文件中创建子文件。子集文件已经有一些数据,我可以复制这些数据,但我希望主文件中可用的字段也可以在子集文件中使用。

例子:

subset file format:
1234^A56^A78^A910^A1112^A13^A14^A151617^A18^A192021.000000^A22.000000

master file format:
1242^A2282^A2^A1^A0
1234^A78^A910^A4^A4
1380^A2594^A2^A25^A3
1404^A2447^A6^A44^A9

在上面的例子中,主文件有 4 行,而子文件有 1 行。主文件第 2 行的值与子文件中的行匹配。

我想在主文件中创建附加行,也到子文件中。基本上,子文件中的第一个、第三个和第四个字段应该与主文件的前三个字段匹配,其余的可以是任何随机生成的值。

另外,我希望在子集文件中保留 ^A 分隔符。

【问题讨论】:

  • 它们可以在内存中处理还是必须使用流?
  • 是 ctrl-A (0x01 SOH - 标题开头) 字面意思是 '^' 和 'A'?
  • 主文件大约600-700 MB,不知道在内存中怎么做?
  • 它是 ctrl-A 而不是 ^ 和 A 分开。

标签: perl


【解决方案1】:

假设您要将所有记录附加到同一个子集文件,请使用

#! /usr/bin/perl -l

use warnings;
use strict;

# demo only
my $buf = join "" =>
          map "$_\n" =>
          "1242\cA2282\cA2\cA1\cA0",
          "1234\cA78\cA910\cA4\cA4",
          "1380\cA2594\cA2\cA25\cA3",
          "1404\cA2447\cA6\cA44\cA9";
open my $master, "+<", \$buf or die "$0: open: $!";

open my $subset, ">>", "subset.dat" or die "$0: open: $!";

while (<$master>) {
  chomp;
  my($id,$x,$y) = (split /\cA/)[0..2];

  print $subset join "\cA" =>
    $id, 56, $x, $y, 
    1112, 13, 14, 151617, 18, 192021.000000, 22.000000;
}

close $subset or warn "$0: close: $!";

perlop 中所述,转义序列 \cA 会生成您正在使用的 Ctrl-A (ASCII SOH) 分隔符。为了保持演示的独立性,上面的代码读取$buf 就好像它是一个文件,但你当然会在生产环境中打开主文件。

通过less查看的输出再次加粗^A表示ASCII SOH:

1242^A56^A2282^A2^A1112^A13^A14^A151617^A18^A192021^A22
1234^A56^A78^A910^A1112^A 13^A14^A151617^A18^A192021^A 22
1380^A56^A2594^A2^A1112^A 13^A14^A151617^A18^A192021^A 22
1404^A56^A2447^A6^A1112^A 13^A14^A151617^A18^A192021^A 22

【讨论】:

    【解决方案2】:
    1. 使用 split 从主文件中获取字段。
    2. 使用 rand($range) 生成随机值。
    3. 使用 join 将字段和随机值放在一起。

    这能回答你的问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2011-07-24
      • 2020-03-22
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多