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

u3r8eeie  于 2023-04-22  发布在  其他
关注(0)|答案(5)|浏览(92)

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

y3bcpkx1

y3bcpkx11#

例如:

$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)。

hfwmuf9z

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
hwamh0ep

hwamh0ep3#

不要使用正则表达式。你必须处理引号字段可能包含逗号或转义引号的问题。
相反,使用Perl模块Text::CSV将输入行正确地解析为字段,然后只输出您感兴趣的字段。

lfapxunr

lfapxunr4#

这不是Perl,但也许它会有所帮助:

cut -d, -f1-5 test.csv
c6ubokkw

c6ubokkw5#

在ECMAscript中,我一直在使用这个正则表达式
CSV文件的前8列,包括空值(如果需要,替换结果中的最后一个逗号“,”)

^(([^,]*,){8})

https://regex101.com/r/qtGO5f/3
若要获得不带CSV HEADER的结果,请在第一个新行(\n)后开始匹配

\n(([^,]*,){8})

https://regex101.com/r/23jUrP/1

相关问题