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

用于捕获文本中的标题并添加到行的Perl脚本,perl,Perl,我试图找出如何重写我的代码,在my report.txt中捕获一个标题,然后将其添加到每一行,一旦标题更改,我希望它捕获新标题并将其放置到每一行。我已经包括了一个我期待的样本。我知道我的代码缺少一些东西来获得预期的输出,这就是为什么我在这里寻求帮助。我对perl非常陌生,所以请提供任何帮助或步行体验将非常棒 use strict; use warnings; open (NEW, ">", "output.txt" ) or die "could not open:$!"; open

我试图找出如何重写我的代码,在my 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);
预期输出.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  

你就快到了。要捕获标题,首先创建一个变量 等一下:

现在,在循环中,您需要确定什么是标题行和 保存它。最后一个更改是在常规行之前打印标题,因此 下面是代码的重构形式,其中添加了以下内容:

while (<FILE>) {
    if (/^\s*BAR/) {
        # Line is a header. Save it
        ($header) = /(BAR.\w+)/;
    } elsif (/^\h{3}\d/) {
        # Regular line. Print header and line
        print NEW $header, "\t", $_;
    }
}
while(){
如果(/^\s*BAR/){
#行是标题。请保存它
($header)=/(条。\w+/;
}elsif(/^\h{3}\d/){
#常规行。打印标题和行
打印新的$header,“\t”,$\u;
}
}
这将自动进行。如果该行是标题,它将保存。如果是
是一个常规行,它将打印当前标题和行。

我对此进行了很多猜测,因为我不知道您的文件的细节。。。例如,我看到的前导空格可能就是粘贴数据的方式。另外,是固定宽度还是制表符分隔

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

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;
使用严格;
使用警告;
打开我的$NEW“>”、“c:/cdh/output.txt”或“无法打开:$!”;

打开我的$文件,“您的标题是否总是以
BAR
开头?@sidyll是的,标题总是以BAR开头并包含相同数量的空格。与BAR.COMP1相比,为什么BAR.COMP2在
G2
之前有空格?你试过什么?这似乎太简单了,没有表现出一种尝试。你说你是Perl新手,所以如果你不理解这里使用的其中一句话,请告诉我:-)你我的朋友是一个绝对的救命恩人!这正是我试图做的,但我一生都不知道如何编写代码。我很尴尬地发布了我的可怕的Perl脚本,这就是为什么我发布了最基本的脚本。哈哈哈。。。万分感谢!哈哈,别担心@PhoenixJay,以后发布代码时不要尴尬,如果我们犯了错误,我们都会学到。很高兴它对你有用。Best wishesHi,我想知道你是否可以帮我写另一个代码,一部分复制行很好,但第二部分在那里复制行,但将所有单词捆绑在一起,例如索赔失败-文件通知,导出为“CLAIMFAILED-FILENOTICE”
while (<FILE>) {
    if (/^\s*BAR/) {
        # Line is a header. Save it
        ($header) = /(BAR.\w+)/;
    } elsif (/^\h{3}\d/) {
        # Regular line. Print header and line
        print NEW $header, "\t", $_;
    }
}
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;