【问题标题】:Removing double quotes from a csv file从 csv 文件中删除双引号
【发布时间】:2014-05-05 16:17:58
【问题描述】:

我想从我的 csv 文件中删除所有双引号,并且正在努力让 tr、sed 或 perl 为我工作并输出到文件:

perl -e 's/\"//g;" input.csv > output.csv 没有输出到屏幕或文件,没有创建 output.csv

sed 's/\"//g' input.csv > output.csv 将输出打印到屏幕上,然后给出错误“无法读取>:没有这样的文件或目录”“无法读取 output.csv:没有这样的文件或目录”

cat input.csv | tr -d '\"' > output.csv 给出错误“tr:额外操作数'>'”,然后出现错误“写入错误:设备上没有剩余空间”

我做错了什么?

【问题讨论】:

    标签: perl sed tr


    【解决方案1】:

    要让您的 perl 版本正常工作,您只需要 -p 选项来指示打印到屏幕:

    perl -pe 's/"//g' input.csv > output.csv
    

    或者,如果您在 Windows 上,请执行以下操作:

    perl -pe "s/\x22//g" input.csv > output.csv
    

    另外,我建议不要盲目地从 csv 中删除双引号,而是使用实际的 csv 解析器来选择性地仅从不需要的字段中删除双引号。以下脚本可以做到这一点:

    use strict;
    use warnings;
    
    use Text::CSV;
    
    my $csv = Text::CSV->new ( { binary => 1, eol => "\n" } )
                    or die "Cannot use CSV: ".Text::CSV->error_diag();
    
    if (@ARGV != 1) {
        print "usage: $0 [csvfile]\n";
        exit;
    }
    
    while (<>) {
        $csv->parse($_);
        $csv->combine( $csv->fields() );
        print $csv->string();
    }
    

    【讨论】:

    • 仍然无法正常工作,它说“无法进行就地编辑:> 不是常规文件”和“无法打开 output.csv:没有这样的文件或目录”我将这些解释为 perl尝试将“>”和“output.csv”作为文件读取以将命令应用于...
    • 为 windows 写了一个新的 1-liner。
    • +1(因为任何人都可以投票)建议 Text::CSV。让合适的工具完成合适的工具的工作。
    • 试图以非结构化方式处理结构化数据总是很痛苦。
    【解决方案2】:

    试试这个(未经测试):

    tr -d "\"" < input > output
    

    【讨论】:

    • Windows 不喜欢单引号 - 我会修改我的答案。
    • 优秀 - 做到了。
    • 我认为 perl、awk、sed 和 tr 在 Windows 中都必须使用双引号。
    • 这更像是 Windows 命令提示符需要双引号,并且对于 Perl、awk、sed、tr 甚至是伟大的 Dijkstra 都不例外。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2017-02-13
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多