我有一个结构如下的示例文件,我想对它执行一些操作:
1112283569;AOEEEEAOAO.;300012299419;0030000302;ALLE;0.00;0.00;0.00;0.00;79149449.66;0.00;7914944
1112283569;AOEEEEAOAO.;300012;;;;AAAAA299419;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
*;CON;*;0030000302;ΑLLEO;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149449.66;0.00
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00
我试图想出一个解决方案。我需要读一个看起来像上面那个的文件, 由';'分隔;我需要在每行第三个分隔符后对字符进行检查。它不会在 静态列,所以我需要一些方法来捕获第n个分隔符(;)之后的字符,我可能能用正则表达式做这个(我想。)
即,对于上面的输出:
第1行 - 不符合条件 第2行 - 不符合条件 3号线 - 符合条件 第4行 - 不符合条件 第5行 - 符合条件
最后它会输出如下内容:
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00
(只有第三个分隔符后的第一个字符为*的行) 我发现这种类型的正则表达式,但我不确定它会适用于这种情况? :
/\%(^\%([^ ]* \)\{6\}\)\@<=.
答案 0 :(得分:2)
您只需split
- ;
,然后检查所需字段的第一个字符即可。
use strict;
use warnings;
my $char = '*';
my $nth = 3;
my $file = 'data_delim.txt';
open my $fh, '<', $file or die "Cannot open $file -- $!";
while (my $line = <$fh>)
{
my @fields = split ';', $line, $nth+1;
if ($fields[$nth] =~ m/^\Q$char/) {
print $line;
}
}
上面的$nth
代表&#34; Nth&#34;问题示例中的规范3
。我们通过传递最后一个参数告诉split
只接受所需的N + 1个元素。 \Q
逃脱了*
,否认它的特殊含义。见quotemeta。您只能选择检查所需的字段并将循环体缩短为
print $line if (split ';', $line)[3] =~ m/^\Q$char/; # or /\*/
我怀疑这个问题可能涉及更多,并保留所有先前的条款。
对于显示输入的输入文件data_delim.txt
,打印
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149 ;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00
我使用了样本输入和输出,因为我没有完全理解描述。我只能希望这是对这个问题的正确解释。