Eliminación de comillas dobles y sustitución de comas dentro de ellas.

Eliminación de comillas dobles y sustitución de comas dentro de ellas.

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 Londondebajo 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_quotesY asegurándose de que escape_charno 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

información relacionada