1

我有一个 perl 脚本,它打开一个 txt 文件,对其进行解析,以便将适当的文本输出到 csv 文件。我现在为一个文件工作得很好,但我有很多类似的文件要以完全相同的方式处理。我希望能够自动执行此操作,因此代码将通过 file1.txt 运行并解析我想要 output.csv 的文本,然后通过 file2.txt 运行并将此输出附加到相同的 output.csv 中。我在下面包含了我的代码的相关位,仅排除了在 while 循环中进行实际解析的代码,因为我不需要更改它。输入文件的名称一致,例如 file1.txt、file2.txt、file3.txt 等,并且都位于同一目录中

my $mode = "none";
open(my $infile,"<","file1.txt") or die $!;
open (my $outfile,">>","output.csv") or die $!;
while (<$infile>)
{
    chomp; 
    if ($_ =~ /^Section 1/) {
        $mode = "sec1";
    }
    if ($_ =~ /^Section 2/) {
        $mode = "sec2";
    }

    if ($mode =~ "sec1") {
      $_=~ tr/,//d;

      if ($_ =~ /.\%$/){
        print $outfile $_;
        print $outfile "\n";
      }
      else{
        print $outfile $_;  
      }

    }    
}

close $infile;
close $outfile;

输出文件应该类似于这个(显然不是这个文本,我只是强调它必须附加输出,我想我已经通过使用 >> 而不是 >)

this is from file 1
this is from file 2
this is from file 3
4

4 回答 4

3

您只需要将其包装在一个循环中,如下所示:

for my $file ( @list_files ) {
    open $in_fh, "<", $file;
    while (my $line = <$in_fh>) {
    # and the rest of your stuff goes here
于 2013-04-10T21:32:07.933 回答
2

您可以使用菱形运算符 <>和标量$ARGV变量:

use strict; use warnings;

while (<>) {
    print "Processing [$_] from $ARGV\n";
}

这和

use strict; use warnings;

while (<ARGV>) {
    print "Processing [$_] from $ARGV\n";
}

如果里面有东西@ARGV

于 2013-04-10T21:42:24.267 回答
1

只需将必要的文件放入@ARGV,就好像它们是在命令行上键入的一样。然后从ARGV文件句柄中读取。

use strict;
use warnings;

our @ARGV = do {
    opendir my $dh, '.' or die $!;
    grep /^file\d+\.txt$/, readdir $dh;
};

while ( <ARGV> ) {
  ...
}
于 2013-04-10T23:26:05.380 回答
0

很容易打开命令行中给出的所有文件。有一个特殊的文件句柄,称为ARGV.

例子:

#!/usr/bin/perl

use strict;
use warnings;

while (<ARGV>) {
    print $_;
}

命令行:

test.pl file*.txt

所有文件都将被连接起来。

如果您在代码“内部”有文件列表,则可以将它们加载到@ARGV数组中,然后使用<ARGV>.

于 2013-04-10T21:40:08.663 回答