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.