在Perl中一次处理多个文件?

时间:2013-04-10 21:28:07

标签: perl parsing

我有一个打开txt文件的perl脚本,解析它以便将相应的文本输出到csv文件。我现在为一个文件工作得很好,但我有大量类似的文件以完全相同的方式工作。我希望能够自动执行此操作,以便代码将通过file1.txt工作并解析我想要输出的文本。然后通过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;

输出文件应该类似于此(显然不是这个文本,我只是强调它必须附加输出,我认为我已经使用&gt;&gt;而不是&gt;)

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

4 个答案:

答案 0 :(得分:3)

你只需将它包装成一个循环:

for my $file ( @list_files ) {
    open $in_fh, "<", $file;
    while (my $line = <$in_fh>) {
    # and the rest of your stuff goes here

答案 1 :(得分:2)

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

use strict; use warnings;

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

这与

相同
use strict; use warnings;

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

如果@ARGV中存在某些内容。

答案 2 :(得分:1)

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

use strict;
use warnings;

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

while ( <ARGV> ) {
  ...
}

答案 3 :(得分:0)

可以轻松打开命令行中给出的所有文件。有一个特殊的文件句柄,称为ARGV

示例:

#!/usr/bin/perl

use strict;
use warnings;

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

命令行:

test.pl file*.txt

将连接所有文件。

如果代码中有“文件内容”,则可以将其加载到@ARGV数组,然后使用<ARGV>