如何使用正则表达式删除csv文件中字符串中特定字段的前导和尾随空格

问题描述 投票:-1回答:2

我们在这里输入:

X,XXXXX,XXXXXX,  YYYYYY ,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY, XXXXXXX    ,TTTTTT,XX XXXX,XX

我尝试了正则表达式:s/\s//g但是这个替换将替换字符串中的所有空格ANYWHERE。

请建议正则表达式只修剪和跟踪整个字符串中的特定字段??

预期产量是:

X,XXXXX,XXXXXX,YYYYYY,TTTTTTT,XXXXXXX,XXXXX  XXXX
Y,YYYYY,YYYYYY,YYY,XXXXXXX,TTTTTT,XX XXXX,XX

删除该特定字段之前和之后的空格。它不会打扰已经有空间的其他领域。

perl
2个回答
1
投票

注意这与字符串或多或少有关,如字段内部严格没有逗号。

如果问题与常规CSV文件有关,请不要考虑正则表达式。使用模块解析文件并选择所需的字段。这是我想到的最多的recent post(你不希望allow_whitespace用于你的目的)。还有更多,请搜索。


使用空格捕获所有字段,作为非逗号字符

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

或者,如果字符串在字段中可能有多个单词

perl -Mstrict -wE'
    $_ = q( xxx ,   yyy more ,hey,zz oo ,  aaa); say;
    my $N = 2;
    my $c; 
    s/(\s*( (?:[^,]+)?[^, ] )\s*)/++$c==2 ? $2 : $1/gex; say
'

这些适用于来自$N的所有1..5


0
投票

所以我有两个可能的答案。一个使用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了:

#!/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

使用Text::CSV,您将需要将其提供给STDIN或将文件打开到您的CSV文件。使用split你可以使用<>

然而,这两者都不是真正的“正则表达式”解决方案,因为IMO完全是错误的工具。

© www.soinside.com 2019 - 2024. All rights reserved.