
Я ищу команду, которая может удалить одну/две двойные кавычки из файла формата 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
AND, убедившись, что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