我正在寻找一个命令,可以从 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