我正在使用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
。
答案 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