我有一个打开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
答案 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>
。