【问题标题】:Unix Sed to remove leading and trailing spaces in the CSV formatted file without considering String value which has commaUnix Sed 删除 CSV 格式文件中的前导和尾随空格,而不考虑具有逗号的字符串值
【发布时间】:2013-09-07 19:14:19
【问题描述】:

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

【问题讨论】:

标签: sed


【解决方案1】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • +1。惊人的,但与许多 sed 解决方案一样,基本上无法维护
    • @Potong,
      我尝试了给定的解决方案:
      ** sed 's/("[^"]*"|[^,]+|,)\ s*,\s*/\1,/g' SourceFile > FinalOutputFile **
      ** sed: 0602-404 Function s/("[^"]*"|[^,]+|,)\ s*,\s*/\1,/g 无法解析。 **

      在替换字符串 \1 前添加反斜杠,并执行 Sed :

      ** sed 's/("[^"]*"|[^ ,]+|,)\s*,\s*/\\1,/g' SourceFile > FinalOutputFile. **
      它似乎没有从字符串和十进制值中删除前导空格。
      我在这里做错了吗?
    • @user2755789 我认为您可能错过了命令开头的重要-r 开关。
    • 感谢@Potong 的回复。当我尝试使用 -r 选项时,出现以下错误: $ sed -r 's/("[^"]*"|[^,]+|,)\s*,\s*/\1,/ g' SourceFile > FinalOutputFile sed:无法识别标志:r 用法:sed [-n] [-u] 脚本 [File ...] sed [-n] [-u] [-e Script] ... [- f Script_file] ... [文件 ...]
    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多