我目前面临的问题似乎很容易处理,但到目前为止我还没能解决。我有一个“管道分隔值”文件,我想删除每一行上所有值的所有前导和尾随空格。该文件可能包含多行。
示例:
1| | Field2 | Field3
2| 123 | Field2 |
3| | | Field3
删除空格后我想要的是什么:
1||Field2|Field3
2|123|Field2|
3|||Field3
只要最后一个字段(在本例中为Field3)不为NULL,我到目前为止的工作。这对应于上述示例中的第2行。当最后一个字段为NULL时,它将该行与下一个字段连接起来,创建比预期更大的行。
到目前为止我的代码就是这个:
$res =~ s/\s*\|\s*/\|/g;
如前所述,只要所有行上的最后一个字段不为NULL,就可以正常工作。我试图提出一个正则表达式,匹配除了最后一个管道之外的所有管道但到目前为止没有成功。
我知道如何删除所有空格并保持线路完整性吗?
提前致谢,
若昂
答案 0 :(得分:5)
正则表达式/\s/
匹配回车符和换行符(以及其他内容)以及空格和制表符,因此您的替换将删除具有空最终字段的记录上的尾随换行符。
尝试
$res =~ s/[ \t]*\|[ \t]*/|/g;
或
$res =~ s/[ ]*\|[ ]*/|/g;
如果您对删除制表符不感兴趣。
(替换字符串中的管道不需要转义。)
答案 1 :(得分:0)
my $file_data = <<DATA;
1| | Field2 | Field3
2| 123 | Field2 |
3| | | Field3
DATA
foreach my $line (split /[\n\r]/, $file_data) {
my @fields;
foreach my $field (split /\|/, $line) {
$field =~ s/^\s*(.*?)\s*$/$1/;
push @fields, $field;
}
print join '|', @fields;
print "\n";
}