Remoção de aspas duplas e substituição de vírgula dentro dela

1

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, de modo que todo o campo possa se parecer com um.

Ex: ""Wembley,London"" a ser exibido como Wembley London em uma coluna no csv.

Além disso, o comando para "Wembley, Londres", 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, são o meu arquivo de saída.

    
por Abhishek 28.08.2018 / 15:13

2 respostas

1

Se você tiver CSV válido, um analisador CSV adequado deverá ser usado. O ruby é 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 as citações incorporadas em um campo CSV exigem que as cotações sejam dobradas . Se você tiver

""Wembley,London"","other stuff",...

então você tem CSV malformado.

    
por 28.08.2018 / 16:47
0

O módulo Texto :: CSV do Perl pode lidar com CSV malformado desse tipo:

If there is really bad CSV data, like

1,"foo "bar" baz",42

or

1,""foo bar baz"",42

there is a way to get this data-line parsed and leave the quotes inside the quoted field as-is. This can be achieved by setting allow_loose_quotes AND making sure that the escape_char is not equal to quote_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
    
por 29.08.2018 / 02:35