我正在使用 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
所以这里不必使用。
我正在使用 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
所以这里不必使用。
例如:
$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)。
您不一定需要正则表达式:
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
不要使用正则表达式。您将不得不处理包含逗号或转义引号的引用字段的可能性。
相反,使用 Perl 模块Text::CSV
将输入行正确解析为字段,然后仅输出您感兴趣的字段。
这不是 perl,但也许它有帮助:
cut -d, -f1-5 test.csv