Perl脚本捕获文本中的标题并添加到行

时间:2015-12-28 19:24:10

标签: perl

我试图弄清楚如何重写我的代码以捕获我的report.txt中的标题并将其添加到其后的每一行,一旦标题更改我希望它捕获新标题并将其放置到每一行之后。我已经包含了一些我正在寻找的样本。我知道我的代码缺少某些东西以获得我的预期输出,这就是我在这里寻求帮助的原因。我是perl的新手,所以请任何帮助或走路都会很棒。

use strict;
use warnings;

open (NEW, ">", "output.txt" ) or die "could not open:$!";

open (FILE, "<", "Report.txt") or die "could not open:$!";

    while (<FILE>) {
        print NEW if /^\h{3}\d/;
}
close (FILE);
close (NEW);

REPORT.TXT

DATE: 12/14/15
                          BAR.COMP1
    G2,,,,,,,USER LOGS
    DEVICE          EMULATOR   FROM-THRU    MINS  ROUTINE
    G1,,,,,,,USER LOGS
    COMPUTER04.1                 0726 0808    42    Process Account

              Account Name  Master Patient Number   Account Number
   0727       JOHN DOE      1234567899              1234567899   
   0730       JOHN DOE      1234567899              1234567897 
   0732       JOHN DOE      1234567899              1234567899   
   0742       JOHN DOE      1234567899              1234567893  
   0744       JOHN DOE      1234567899              1234567893

 DATE: 12/14/15
                          BAR.COMP2
     G2,,,,,,,USER LOGS
    DEVICE          EMULATOR   FROM-THRU    MINS  ROUTINE
    G1,,,,,,,USER LOGS
    COMPUTER04.1                 0726 0808    42    Process Account

               Account Name  Master Patient Number   Account Number
    0727       JOHN DOE      1234567899              1234567899   
    0730       JOHN DOE      1234567899              1234567897 
    0732       JOHN DOE      1234567899              1234567899   
    0742       JOHN DOE      1234567899              1234567893  
    0744       JOHN DOE      1234567899              1234567893

预期OUTPUT.TXT

BAR.COMP1   0727       JOHN DOE      1234567899         1234567899   
BAR.COMP1   0730       JOHN DOE      1234567899         1234567897 
BAR.COMP1   0732       JOHN DOE      1234567899         1234567899   
BAR.COMP1   0742       JOHN DOE      1234567899         1234567893  
BAR.COMP1   0744       JOHN DOE      1234567899         1234567893
BAR.COMP2   0727       JOHN DOE      1234567899         1234567899   
BAR.COMP2   0730       JOHN DOE      1234567899         1234567897 
BAR.COMP2   0732       JOHN DOE      1234567899         1234567899   
BAR.COMP2   0742       JOHN DOE      1234567899         1234567893  
BAR.COMP2   0744       JOHN DOE      1234567899         1234567893  

2 个答案:

答案 0 :(得分:1)

你快到了。要捕获标头,首先要创建一个变量 坚持下去:

$event->getRequest()->getSession()->setParameter('account_number', $account->getAccountNumber());

现在,在你的循环中,你需要确定什么是标题行和 保存。最后一个更改是在常规行之前打印标题,所以 这是一个重构的代码形式,包含以下内容:

my $header;

这将自动进行。如果该行是标题,它将保存。如果它 是一个常规行,它将打印当前标题加上该行。

答案 1 :(得分:0)

我已经对此进行了很多猜想,因为我不知道你文件的具体内容......例如,我看到前导空格可能只是你粘贴数据的方式。此外,是固定宽度还是制表符分隔?

无论如何,这并不优雅,但它可能会让你朝着这个方向前进。

use strict;
use warnings;

open my $NEW, ">", "c:/cdh/output.txt" or die "could not open:$!";
open my $FILE, "<", "c:/cdh/Report.txt" or die "could not open:$!";

my $file;
my $line_status = 0;

while (<$FILE>) {
  if (/^\s*DATE:/) {
    $line_status = 1;
    next;
  } elsif (/^\s+Account Name/) {
    $line_status = 2;
    next;
  }

  if ($line_status == 1) {
    chomp;
    tr/ //d;
    $file = $_;
    $line_status = 0;
    next;
  } elsif ($line_status == 2) {
    if (/\w/) {
      print $NEW "$file\t$_";
    } else {
      $line_status = 0;      
    }
  } 
}
close $FILE;
close $NEW;