我想通过比较最后一行中作为字符串显示的浮点数来将文件内容拆分为多个输出文件。例如,下面的文件包含超过100K这样的行:
Start:/abc/def
.....
End 1.2
Start:/xyz/uvw
.....
End 2.8
如果Start
包含1到1.9之间的值,我想打印从End
到OUTFILE1
到End
的每一行。否则,如果OUTFILE2
包含介于2和2.9之间的值,则将所有此类行打印到End
。同样,必须基于浮动值的离散范围(即0-1,1-2,2-3等)生成多个输出文件。如果给定范围内有许多浮动值,则条目应附加到输出文件。
我在下面尝试的代码在正确比较浮点数方面存在问题,也存在有条件地将数组内容清空到所需输出文件的问题。有任何建议如何修复它?
foreach $lineIn(@file1_list) {
$_ = $lineIn;
if (/Start:/) {
$pattern1 = 1;
} elsif(/End\s/) {
my @slackno = split / \s + /, $_;
$pattern2 = 1;
push(@buflines, $_);
}
if ($pattern1 = ~1 and $pattern2 = ~0) {
push(@buflines, $_);
} else {
$pattern1 = 0;
$pattern2 = 0;
}
}
if ($slackno[3] >= 2.0 and $slackno[3] <= 2.9) {
foreach(@buflines) {
print FILE2 $_;
}
}
close(FILE2);
答案 0 :(得分:2)
在测试End
时捕获数字,然后处理完整的文本块。
例如,提取捕获的数字的整数部分,然后从数字中减去它以查看它是否为<= 0.9
。然后该整数或它+ 1用于文件名。在这里我们还需要清除缓冲区。
use warnings;
use strict;
my $file = 'data.txt';
open my $fh, '<', $file or die "Can't open $file: $!";
my @buff;
while (<$fh>)
{
push @buff, $_;
if (my ($num) = /^End\s+(.*)/)
{
my $N = int $num;
my $fout = 'name_'. ($num - $N <= 0.9 ? $N : $N+1 ) . '.txt';
open my $fh_out, '>>', $fout or die "Can't open $fout: $!";
print $fh_out $_ for @buff;
@buff = ();
}
}
这预计End num
肯定是一个块的结束。打开文件以追加(>>
),因为具有相同范围的数字的块应该全部进入该范围的文件中。此外,以附加模式打开文件会创建一个新文件(如果它尚未存在),以便同时处理这两种可能性。
使用包含同一范围内的多个块和N.95
的块的数据进行测试。