代码之家  ›  专栏  ›  技术社区  ›  gagneet

分析文本文件中的行,并在其中添加其他文件中的某些字段

  •  1
  • gagneet  · 技术社区  · 15 年前

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

    例子:

    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 回复  |  直到 15 年前
        1
  •  2
  •   Greg Bacon    15 年前

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

    #! /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 产生 全选 (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
    
        2
  •  0
  •   Vanessa MacDougal    15 年前
    1. 使用split从主文件中获取字段。
    2. 使用rand($range)生成随机值。
    3. 使用Join将字段和随机值放在一起。

    那能回答你的问题吗?