
Estoy buscando un comando que pueda eliminar una o dos comillas dobles de un archivo en formato CSV y las comas dentro de ellas para sustituirlas por espacios para que todo el campo parezca uno.
Ej: ""Wembley,London""
se mostrará Wembley London
debajo de una columna en el csv.
Además, el mando de "Wembley,London" como Wembley London. Independientemente de la posición del campo, el script leerá el archivo.
Probé los siguientes comandos pero no son útiles.
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##
En ambos casos, sample_ups1 es mi archivo de salida.
Respuesta1
Si tiene un CSV válido, se debe utilizar un analizador de CSV adecuado. Ruby's es fácil de usar: si
cat file.csv
"""Wembley,London""",a,"b","c, ""d e"", ""f,g"",h"
entonces
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
Tenga en cuenta que las comillas incrustadas en un campo CSVrequerir que las comillas se dupliquen. Si usted tiene
""Wembley,London"","other stuff",...
entonces tienes un formato CSV incorrecto.
Respuesta2
PerlTexto::CSVEl módulo puede manejar CSV con formato incorrecto de este tipo:
Si hay datos CSV realmente malos, como
1,"foo "bar" baz",42
o
1,""foo bar baz"",42
Hay una manera de analizar esta línea de datos y dejar las comillas dentro del campo citado tal como están. Esto se puede lograr configurando
allow_loose_quotes
Y asegurándose de queescape_char
no sea igual aquote_char
Así por ejemplo
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