0

我正在使用 Perl 处理 CSV 文件。

如何在从第五个逗号开始的每一行中删除所有内容(换行符除外)?

例如"a,b,c,d,e,f,g,h,i,\n"会变成"a,b,c,d,e\n".

$entire_csv_file_contents =~ s/what do I write here?//gm;

因为数据不会包含引用字段等,Text::CSV所以这里不必使用。

4

4 回答 4

3

例如:

$entire_this_is_not_csv_file_contents =~ s/^(([^,]+,){4}[^,]+).*/$1/gm;

如果您不需要 perl 5.8.x 兼容性,您可以使用\K转义,因此不需要捕获(感谢 amon 的建议):

$entire_this_is_not_csv_file_contents =~ s/^(?:[^,]+,){4}[^,]+\K.*//gm;

此外,根据字段是否为空,您应该将此处的“+”替换为“*”(也感谢 amon)。

于 2013-07-19T06:29:57.250 回答
3

您不一定需要正则表达式:

use strict;
use warnings;

chomp(my $line = "a,b,c,d,e,f,g,h,i,\n");
my $cutoff = 5;
my $shortened_line = join(',', (split(/,/, $line, $cutoff+1))[0..$cutoff-1]);

print "$shortened_line\n";   # => a,b,c,d,e
于 2013-07-19T06:36:36.240 回答
2

不要使用正则表达式。您将不得不处理包含逗号或转义引号的引用字段的可能性。

相反,使用 Perl 模块Text::CSV将输入行正确解析为字段,然后仅输出您感兴趣的字段。

于 2013-07-19T05:38:36.797 回答
0

这不是 perl,但也许它有帮助:

cut -d, -f1-5 test.csv
于 2013-07-19T04:10:10.343 回答