我正在尝试将一个非常大的文件拆分成文件中基于字符串的较小文件。
例如。输入文件
Block(A){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
}
Block(B){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
}
Block(C){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
}
我想创建三个文件,每个文件包含brakets中的数据
请你告诉我哪里弄错了。我的perl代码
while (<PR>) {
if ($_ =~ ' Block\('))
{
chomp;
close (PW);
$textcell = $_;
$textcell =~ s/Block\(//g;
$textcell =~ s/\)\{//g;
open (PW, ">$textcell.txt") or die "check file";
}
if ( /^ Block\($textcell\)/../^ }/)
{ print PW $_;}
}
正在创建所需的文件,但这些文件是空的。
问候
所需的输出,三个文件:
A.TXT
Block(A){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
}
B.txt
Block(B){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
}
C.txt
Block(C){
Block_area : 2.6112;
Block_footprint : 3BAA5927A22E66B0AE1214A806440F12;
}
答案 0 :(得分:1)
问题在于您的测试会排除任何不属于Block()
行的内容。对于任何其他形式的线路,您什么都不做。此外,您的第二个if
语句正在检查Block
之前是否有两个空格,这种空格永远不会发生。
这就是我写它的方式。它假设至少是Perl 5的第10版,这样我就可以使用autodie
而不是明确地检查每个open
调用的成功。请注意,我在正则表达式上使用了/x
修饰符,因此空格和制表符是无关紧要的,我可以使用它们来使正则表达式更具可读性。
use strict;
use warnings;
use 5.010;
use autodie;
open my $in_fh, '<', 'blocks.txt';
my $out_fh;
while (<$in_fh>) {
open $out_fh, '>', "$1.txt" if / Block \( (\w+) \) /x;
print $out_fh $_ if $out_fh;
}
答案 1 :(得分:1)
我建议改变方法并用块而不是行读取文件,
use strict;
use warnings;
use 5.010;
use autodie;
# input record separator is now '}' followed by old value of separator (i.e \n)
local $/ = "}$/";
while (<>) {
my ($file) = m|\( (.+?) \)|x or next;
open my $fh, ">", "$file.txt";
print $fh $_;
close $fh;
}