Perl 如何使用正则表达式删除csv文件字符串中特定字段的前导空格和尾随空格
我们开始输入:Perl 如何使用正则表达式删除csv文件字符串中特定字段的前导空格和尾随空格,perl,Perl,我们开始输入: X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX 我尝试了regex:s/\s//g,但是这个替换将替换字符串中任何地方的所有空白 请建议只修剪和跟踪整个字符串中特定字段的正则表达式 预期产出为: X,XXXXX,XXXXXX,YYYYYY,TTTTTTT,XXXXXXX,XXXXX XXXX Y,YYYYY,YYYYYY
X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX
我尝试了regex:s/\s//g
,但是这个替换将替换字符串中任何地方的所有空白
请建议只修剪和跟踪整个字符串中特定字段的正则表达式
预期产出为:
X,XXXXX,XXXXXX,YYYYYY,TTTTTTT,XXXXXXX,XXXXX XXXX
Y,YYYYY,YYYYYY,YYY,XXXXXXX,TTTTTT,XX XXXX,XX
删除该特定字段的前后空格。而且它不会干扰已经有空格的其他字段。注意这或多或少与所示的字符串有关,字段内严格没有逗号
如果问题与一般CSV文件有关,请不要考虑正则表达式。使用模块解析文件并选择所需的字段。这是我想到的最重要的一点(您不希望
允许\u空白
用于您的目的)。还有很多,请搜索
捕获所有字段(带空格)作为非逗号字符
my @m = $string =~ /([^,]+)/g;
然后清理你想要的东西,然后加入他们
$m[2] =~ s/^\s+|\s+$//g;
$string = join '', @m;
注意:单独删除空格更快,s/^\s+/;s/\s+$/代码>
或者,对于修剪字段中没有多个单词的字符串
perl -Mstrict -wE'
$_ = q( xxx , yyy ,hey,zz , aaa); say;
my $N = 2;
my $c;
s/(\s*([^, ]+)\s*)/++$c==$N ? $2 : $1/eg; say
'
印刷品
xxx , yyy ,hey,zz , aaa
xxx ,yyy,hey,zz , aaa
这些都适用于1..5
中的所有$N
,因此我有两个可能的答案。一个使用split
,只要您的CSV文件是“基本”的,就可以了-不带引号的逗号/换行符等
不过,这涵盖了大部分内容,因此我建议将其作为一个良好的起点
#!/usr/bin/env perl
use strict;
use warnings;
while ( <DATA> ) {
my @row = split /,/;
s/^\s+// for @row;
s/\s+$// for @row;
print join (",", @row),"\n";
}
__DATA__
X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX
使用Text::CSV
您必须将其输入STDIN
或将文件打开到您的CSV文件中。使用split
可以使用
不过,这两种方法都不是真正的“regex”解决方案,因为这对于这项工作来说是完全错误的工具 您的预期输出是什么?您的“预期输出”与您的描述完全不一致,正则表达式不足以拆分csvfields@ysth嗯。。。当然——我考虑的是OP样式的字符串,而不是一般的CSV文件。否则正则表达式就没有意义了。@ysth-Right,谢谢你。。。他们确实说了“CSV文件”。。。谢谢你的回答。你能解释一下正则表达式吗;s/\s+$/@CodeSeek这两条语句中的第一条在字符串(/^../
)的开头查找所有连续空格(\s+
),并且不替换任何空格(/../
)——因此它将删除它们。第二个在字符串的末尾找到所有连续的空格($
在regex中)并删除它们。谢谢Sobrique…它真的很有用。但我面临的另一个挑战是以comas结尾的输入数据,例如X,XXXXX,XXXXXX,YYYYYY,ttttttttt,XXXXXXX,xxxxxxxxx,,,,,,,,,,,,Y,yyyyyyy,yyyy,XXXXXXX,TTTTTT,XX XXXX,XX,,,,,,,,,,,我只想删除尾随和前导空格..拆分并连接回一行并不能完全给出我所期望的输出。我试图在输入字符串的末尾添加空格。请建议您是否有更好的解决方案
#!/usr/bin/env perl
use strict;
use warnings;
while ( <DATA> ) {
my @row = split /,/;
s/^\s+// for @row;
s/\s+$// for @row;
print join (",", @row),"\n";
}
__DATA__
X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV -> new ();
while ( my $row = $csv -> getline ( \*DATA ) ) {
s/^\s+// for @$row;
s/\s+$// for @$row;
print join (",", @$row),"\n";
}
__DATA__
X,XXXXX,XXXXXX, YYYYYY ,TTTTTTT,XXXXXXX,XXXXX XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX ,TTTTTT,XX XXXX,XX