【问题标题】:How to replace or comment double quotes in a CSV file when the doublequotes are preceded by a number当双引号前面有数字时,如何替换或注释 CSV 文件中的双引号
【发布时间】:2018-09-08 01:14:07
【问题描述】:

Ubuntu 16.04
GNU bash,版本 4.3.48

我有一些 csv 文件没有被正确解析,因为 "" 放置在表示英寸的字段内。

在我们的 csv 文件中,具有多个值的列必须用逗号分隔,然后必须用双引号将列括起来,如下所示:
"one","two","three, three, three, three","four","five"

国外""的例子

... star","Radio data system,Radio: AM/FM 8"" Diagonal Color Touch Screen,Single Slot CD/MP3 Player, Nicer","Siera ...
... star","Rear Wheelhouse Liners,Thin Profile LED Fog Lamps,4.2"" Diagonal Color Display Driver Info Center,Chevrolet Connected Access","Chevrolet ...

我知道我可以像这样使用 sed 替换 "" 引号 sed -i 's/""/inch/g' filename.csv

但是当列不包含信息时,这会导致问题,如下所示:

... star","Program. Exp. 10/01/2018","","All Star Edition,LT Plus Package, somemore ...","Felix ...

所以我正在寻找一种方法来替换前面有数字的双引号。

【问题讨论】:

    标签: bash csv sed


    【解决方案1】:

    这样做:

    line1='... star","Radio data system,Radio: AM/FM 8"" Diagonal Color Touch Screen,Single Slot CD/MP3 Player, Nicer","Siera ...'
    line2='... star","Rear Wheelhouse Liners,Thin Profile LED Fog Lamps,4.2"" Diagonal Color Display Driver Info Center,Chevrolet Connected Access","Chevrolet ...'
    line3='... star","Program. Exp. 10/01/2018","","All Star Edition,LT Plus Package, somemore ...","Felix ...'
    
    echo $line1 | sed 's/\([0-9]\)""/\1inch/g'
    echo $line2 | sed 's/\([0-9]\)""/\1inch/g'
    echo $line3 | sed 's/\([0-9]\)""/\1inch/g'
    
    • \([0-9]\):从 0 到 9 的任何数字。括号在那里,因为我们需要在替换中保留数字。
    • \1inch: \1 被我们保留在匹配部分中的数字替换,“英寸”,这很明显;-)
    • 不确定是否要保留一个“,只需简单修改即可完成:echo $line3 | sed 's/\([0-9]\)""/\1inch"/g'

    【讨论】:

    • ,"", 缺失的值并不总是缺失,所以我们不需要弄乱任何以逗号开头并以逗号结尾的内容。
    【解决方案2】:

    您不必(也不应该!)替换或删除那些嵌入的引号。第二个引号用于转义字段内的双引号。

    以你的第一个例子:

    "one","two","three, three, three, three","four","five"
    

    假设我们要在第三个字段中插入"test",包括那些引号:

    "one","two","three, "test", three, three, three","four","five"
    

    这对解析器来说是个问题。因此,这些引号必须用另一个引号转义:

    "one","two","three, ""test"", three, three, three","four","five"
    

    有关格式的更多详细信息,请参阅rfc4180

    因此,在您的 csv 文件中,数据是正确的(引号已正确转义):

    ,"Radio data system,Radio: AM/FM 8"" Diagonal",
    

    您所要做的就是告诉解析器字段被引用并且(可选地)嵌入的引号被另一个引号转义(一些系统使用\ 来转义这些引号)。

    在解析之前删除或替换这些引号对可能会引入各种问题和错误。

    【讨论】:

    • 我的实例中的双引号代表英寸,我想删除它们,因为这个应用程序中的单词英寸看起来比“”好得多。我明白你在说什么,我非常感谢。
    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2016-03-18
    • 2018-02-13
    • 2018-09-23
    相关资源
    最近更新 更多