我正在使用Perl处理CSV文件。如何删除从第五个逗号开始的每一行中的所有内容(除了换行符)?例如,"a,b,c,d,e,f,g,h,i,\n"将变为"a,b,c,d,e\n"。
"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。
Text::CSV
y3bcpkx11#
例如:
$entire_this_is_not_csv_file_contents =~ s/^(([^,]+,){4}[^,]+).*/$1/gm;
如果你不需要perl 5.8.x兼容性,你可以使用\K转义,所以不需要捕获(感谢amon的建议):
\K
$entire_this_is_not_csv_file_contents =~ s/^(?:[^,]+,){4}[^,]+\K.*//gm;
此外,根据字段是否为空,您应该将此处的“+”替换为“*”(也要感谢amon)。
hfwmuf9z2#
你不一定需要正则表达式:
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
hwamh0ep3#
不要使用正则表达式。你必须处理引号字段可能包含逗号或转义引号的问题。相反,使用Perl模块Text::CSV将输入行正确地解析为字段,然后只输出您感兴趣的字段。
lfapxunr4#
这不是Perl,但也许它会有所帮助:
cut -d, -f1-5 test.csv
c6ubokkw5#
在ECMAscript中,我一直在使用这个正则表达式CSV文件的前8列,包括空值(如果需要,替换结果中的最后一个逗号“,”)
^(([^,]*,){8})
https://regex101.com/r/qtGO5f/3若要获得不带CSV HEADER的结果,请在第一个新行(\n)后开始匹配
\n(([^,]*,){8})
https://regex101.com/r/23jUrP/1
5条答案
按热度按时间y3bcpkx11#
例如:
如果你不需要perl 5.8.x兼容性,你可以使用
\K
转义,所以不需要捕获(感谢amon的建议):此外,根据字段是否为空,您应该将此处的“+”替换为“*”(也要感谢amon)。
hfwmuf9z2#
你不一定需要正则表达式:
hwamh0ep3#
不要使用正则表达式。你必须处理引号字段可能包含逗号或转义引号的问题。
相反,使用Perl模块
Text::CSV
将输入行正确地解析为字段,然后只输出您感兴趣的字段。lfapxunr4#
这不是Perl,但也许它会有所帮助:
c6ubokkw5#
在ECMAscript中,我一直在使用这个正则表达式
CSV文件的前8列,包括空值(如果需要,替换结果中的最后一个逗号“,”)
https://regex101.com/r/qtGO5f/3
若要获得不带CSV HEADER的结果,请在第一个新行(\n)后开始匹配
https://regex101.com/r/23jUrP/1