
Estou procurando um comando que possa remover uma/duas aspas duplas de um arquivo no formato CSV e vírgulas dentro delas para serem substituídas por espaço para que todo o campo possa se parecer com um.
Ex: ""Wembley,London""
para ser mostrado em Wembley London
uma coluna no csv.
Além disso, o comando para "Wembley,London" como Wembley London. Independentemente da posição do campo, o script estaria lendo o arquivo.
Eu tentei os comandos abaixo, mas não é útil.
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##
Ambos os casos, sample_ups1 sendo meu arquivo de saída.
Responder1
Se você tiver um CSV válido, um analisador CSV adequado deverá ser usado. Ruby's é fácil de usar: se
cat file.csv
"""Wembley,London""",a,"b","c, ""d e"", ""f,g"",h"
então
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
Observe que aspas incorporadas em um campo CSVexigir que as cotações sejam duplicadas. Se você tem
""Wembley,London"","other stuff",...
então você tem CSV malformado.
Responder2
PerlTexto::CSVmódulo pode lidar com CSV malformado deste tipo:
Se houver dados CSV realmente ruins, como
1,"foo "bar" baz",42
ou
1,""foo bar baz"",42
existe uma maneira de analisar essa linha de dados e deixar as aspas dentro do campo citado como estão. Isto pode ser conseguido definindo
allow_loose_quotes
AND certificando-se de que theescape_char
não é igual aquote_char
Então, por exemplo
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