Como remover vírgula de um arquivo csv com aspas?

0

Minha entrada é:

Name, Country, City
Jason, US, Memphis, "1,000"
David, US, Little Rock, "8,765,453"
"Karam, Sage", US, Nazareth, "4,678"
"David, simon", US, Chicago, "1,234"

Eu quero a saída como:

Name, Country, City
Jason, US, Memphis, "1000"
David, US, Little Rock, "8765453"
"Karam, Sage", US, Nazareth, "4678"
"David, simon", US, Chicago, "1234"

Eu quero que a vírgula seja removida apenas da quarta coluna e não da primeira coluna.

    
por shashank 14.09.2017 / 06:29

4 respostas

0

Ou com o perl:

perl -pe 's/(\d),(\d)/$1$2/g' infile.txt

que apenas remove todas as vírgulas que estão rodeadas por dígitos (\ d).

Presumi que remover mil separadores era a essência da sua tarefa - não em qual coluna as vírgulas estão localizadas.

    
por 14.09.2017 / 14:15
0

Assumindo que o 4 th arquivado é seu último arquivado, então uma abordagem AWK seria.

awk -F\" '{gsub(",","",$(NF-1))}1' OFS=\" infile.txt

A saída é:

Name, Country, City
Jason, US, Memphis, "1000"
David, US, Little Rock, "8765453"
"Karam, Sage", US, Nazareth, "4678"
"David, simon", US, Chicago, "1234"
    
por 14.09.2017 / 07:03
0

com sed :

sed -e ':a' -e 's/,\([^"]*"$\)//;ta' infile.txt

Você faz um loop contanto que haja uma vírgula a ser removida depois da penúltima citação dupla.

    
por 14.09.2017 / 07:57
0

Eu recomendo que você use um analisador de CSV para dados CSV: o ruby tem um

ruby -rcsv -e '
  data = CSV.read(ARGV.shift, :col_sep => ", ")
  out = CSV.new($stdout, :col_sep => ", ")
  data.each {|row| row[-1].delete! ","; out << row}
' file.csv
Name, Country, City
Jason, US, Memphis, 1000
David, US, "Little Rock", 8765453
"Karam, Sage", US, Nazareth, 4678
"David, simon", US, Chicago, 1234
    
por 14.09.2017 / 15:27