正则表达式只保留CSV文件的每一行中的前N列

时间:2013-07-19 03:53:07

标签: regex perl multiline regex-negation

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

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

E.g。 "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 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

cut -d, -f1-5 test.csv