使用另一个文件中的某些字段解析和添加行到文本文件

时间:2010-02-16 15:48:50

标签: perl

我有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行的值与子文件中的行匹配。

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

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

2 个答案:

答案 0 :(得分:2)

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

#! /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^A13^A14^A151617^A18^A192021^A22
1380^A56^A2594^A2^A1112^A13^A14^A151617^A18^A192021^A22
1404^A56^A2447^A6^A1112^A13^A14^A151617^A18^A192021^A22

答案 1 :(得分:0)

  1. 使用拆分从主文件中获取字段。
  2. 使用rand($ range)生成随机值。
  3. 使用join将您的字段和随机值放在一起。
  4. 这会回答你的问题吗?