1

参考链接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"

预期输出 CSV 文件:

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

2 回答 2

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"
于 2013-09-06T22:38:23.990 回答
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
于 2013-09-07T06:53:04.247 回答