删除双引号并替换其中的逗号

删除双引号并替换其中的逗号

我正在寻找一个命令,可以从 CSV 格式文件中删除一个/两个双引号,并用空格替换其中的逗号,以便整个字段看起来像一个。

例如:""Wembley,London""显示Wembley London在 csv 中的一列下。

此外,“Wembley,London”的命令为 Wembley London。无论字段位置如何,脚本都会读取文件。

我尝试了以下命令,但它没有用。

sed 's/\"//g' $fname >  $Target/sample_UPS1.csv
sed 's/\,/ /g' $Target/sample_UPS1.csv >  $Target/sample_UPS1.csv

awk -F'""' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $fname | sed 's/\"//g'   > $Target/sample_UPS.txt ##For removal of two double quotes and substitution of comma with a space##

awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $Target/sample_UPS.txt | sed 's/\"//g' > $Target/sample_UPS1.txt ##For removal of double quotes and substitution of comma with a space##

这两种情况下,sample_ups1 都是我的输出文件。

答案1

如果您有有效的 CSV,则应使用适当的 CSV 解析器。 ruby 很容易使用:如果

cat file.csv
"""Wembley,London""",a,"b","c, ""d e"", ""f,g"",h"

然后

ruby -e '
    require "csv"
    data = CSV.read ARGV.shift
    data.each {|row| 
        row.each {|field| field.delete! "\""; field.tr! ",", " "}
        puts CSV.generate_line row
    }
' file.csv
Wembley London,a,b,c  d e  f g h

请注意,CSV 字段中嵌入了引号要求报价加倍。如果你有

""Wembley,London"","other stuff",...

那么你的 CSV 格式不正确。

答案2

珀尔的文本::CSV模块可以处理这种类型的格式错误的 CSV:

如果 CSV 数据确实很糟糕,例如

1,"foo "bar" baz",42

或者

1,""foo bar baz"",42

有一种方法可以解析此数据行并将引号按原样保留在带引号的字段内。这可以通过设置allow_loose_quotes并确保escape_char不等于来实现quote_char

所以,例如

echo 'a,b,c,1234,23,""Wembley,London"",267,agty' | 
  perl -MText::CSV -lne '
    BEGIN{$p = Text::CSV->new( {allow_loose_quotes => 1, escape_char => "\\"} )} 
    print join ",", map { s/,/ /g; s/"//g; $_ } $p->fields() if $p->parse($_)
'
a,b,c,1234,23,Wembley London,267,agty

相关内容