Unix Sed用于删除CSV格式文件中的前导和尾随空格,而不考虑具有逗号的字符串值

时间:2013-09-06 22:26:46

标签: sed

引用了链接Smarter Removing Unnecessary WhiteSpace CSV

中给出的解决方案

需要使用unix sed实现此功能。

源CSV文件包含以下数据:

"112", 21,,"4563446" , "VASQUE, HILARI", 365, "LOPEZ, ESTHER O" ,"16:06","00:00",, , 267.95, 463.48,"Test"

预期的OutPut CSV文件:

"112",21,,"4563446","VASQUE, HILARI",365,"LOPEZ, ESTHER O","16:06","00:00",,,267.95,463.48,"Test"

2 个答案:

答案 0 :(得分:3)

使用适当的工具解析CSV。例如,Perl中的Text::CSV_XS

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV_XS;
my $csv = 'Text::CSV_XS'->new({ binary => 1,
                                allow_whitespace => 1,
                                eol => $/,
                              })
        or die 'Text::CSV_XS'->error_diag;

my @rows;
while (my $row = $csv->getline(*DATA)) {
    push @rows, $row;
}
$csv->eof or $csv->error_diag;

$csv->print(*STDOUT, $_) for @rows;

__DATA__
"112", 21,,"4563446" , "VASQUE, HILARI", 365, "LOPEZ, ESTHER O" ,"16:06","00:00",, , 267.95, 463.48,"Test"

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r 's/^/\n/;ta;:a;s/\n$//;t;s/\n("[^"]*")/\1\n/;ta;s/\n(\S+)/\1\n/;ta;s/\n\s+/\n/;ta' file

这会在行的前面插入一个标记,并使用它来锚定正则表达式以删除前导空格。标记移动直到它到达终点然后被移除。

在反思中,使用sed的替代解决方案是:

sed -r 's/("[^"]*"|[^,]+|,)\s*,\s*/\1,/g' file