2

我目前面临一个似乎很容易处理的问题,但到目前为止我还没有解决它。我有一个“管道分隔值”文件,我想删除每一行所有值的所有前导和尾随空格。该文件可能包含多行。

例子:

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,它就可以工作。我试图提出一个正则表达式,它匹配除最后一个管道之外的所有管道,但到目前为止没有成功。

知道如何删除所有空格并保持线路完整性吗?

提前致谢,

若昂

4

2 回答 2

5

正则表达式/\s/匹配回车符和换行符(以及其他内容)以及空格和制表符,因此您的替换将删除具有空最终字段的记录上的尾随换行符。

尝试

$res =~ s/[ \t]*\|[ \t]*/|/g;

或者

$res =~ s/[ ]*\|[ ]*/|/g;

如果您对删除制表符不感兴趣。

(替换字符串中的管道不需要转义。)

于 2012-07-03T14:31:57.687 回答
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";
}
于 2012-07-03T14:36:49.437 回答