
我正在尋找一個命令,可以從 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