Convertendo vários arquivos de CSV delimitado por tabulação para delimitado por vírgula

1

Como posso alterar arquivos .txt delimitados por tabulação para arquivos CSV sem prejudicar o formato?

Eu só consegui alterar o tipo de .txt para .csv , mas todos os dados que foram separados por tab foram colocados na mesma célula do Excel.

Então, o que estou perguntando aqui é:

  1. como alterar a guia para uma vírgula em muitos arquivos?
  2. como alterar os arquivos de .txt para .csv ?
por old_man_river 23.08.2017 / 11:50

3 respostas

2

Você poderia fazer:

perl -MText::CSV -F'\t' -i.orig -lape '
  BEGIN{$c = Text::CSV->new({binary=>1, eol=>""})}
  $_ = $c->string if $c->combine(@F)' ./*.txt

Para converter para adequado CSV (consulte perldoc Text::CSV caso você precise ajustar o formato do CSV). Se tudo que você precisa é converter tabs para vírgulas, é apenas uma questão de tr '\t' , < file.txt > file.csv .

    
por 23.08.2017 / 14:19
1

Usando csvkit :

Assumindo um arquivo de entrada como

a       10,000  e       u
a       o       e       u
a       o       "hello  world"  u
a       o       e       u

em que todos os campos são delimitados por tabulações e onde há também uma tabulação entre as variáveis hello e world (mesmo que as duas palavras pertençam ao mesmo campo indicado pela cotação).

$ csvformat -t file.txt
a,"10,000",e,u
a,o,e,u
a,o,hello       world,u
a,o,e,u

A opção -t para csvformat informa ao utilitário que a entrada é delimitada por tabulação.

Observe que 10,000 foi corretamente citado e que as aspas em torno de hello<tab>world foram removidas, pois agora não é ambíguo.

Para forçar a citação de todos os campos:

$ csvformat -t -U 1 file.txt
"a","10,000","e","u"
"a","o","e","u"
"a","o","hello  world","u"
"a","o","e","u"

Se a entrada estiver usando outro caractere de aspas, como em

$ cat file.txt
a       10,000  e       u
a       o       e       u
a       o       'quote: "hello  world"' u
a       o       e       u

faça isso:

$ csvformat -t -q "'" file.txt
a,"10,000",e,u
a,o,e,u
a,o,"quote: ""hello     world""",u
a,o,e,u

Especificamos que a aspa simples é usada nos dados de entrada com -q "'" .

Para executar isso em vários arquivos, convertendo cada um de um arquivo delimitado por tabulações para CSV, assumindo que queremos processar todos os arquivos .txt no diretório atual :

for name in ./*.txt; do
    csvformat -t "$name" >"${name%.txt}.csv"
done

O ${name%.txt}.csv bit remove a extensão .txt do nome do arquivo e adiciona uma extensão .csv . Isso também pode ser escrito como

for name in ./*.txt; do
    csvformat -t "$name" >"./$( basename "$name" .txt ).csv"
done

Você terá então um conjunto de arquivos .txt (original intocado) junto com seus arquivos .csv correspondentes.

    
por 23.08.2017 / 19:10
-1

Você pode tentar o comando abaixo

sed 's/\t/,/g' yourtab.txt > updatefile.csv
    
por 23.08.2017 / 11:59