引用了链接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"
答案 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