Eu tenho vários arquivos CSV grandes e gostaria deles em TSV (formato separado por tabulação). A complicação é que existem vírgulas nos campos do arquivo CSV, por exemplo:
A,,C,"D,E,F","G",I,"K,L,M",Z
Saída esperada:
A C D,E,F G I K,L,M Z
(onde os espaços em branco no meio são guias "difíceis")
Eu tenho Perl, Python e coreutils instalados neste servidor.
text-processing
python
perl
csv-simple
DarkHeart
fonte
fonte
Respostas:
Python
Adicione ao arquivo nomeado
csv2tab.sh
e torne-o executávelExecuções de teste
fonte
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Elimina o loop também.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Duvido-m
que funciona dessa maneira.Por diversão
sed
,.Se o seu
sed
não suportar-E
, tente com-r
. Se vocêsed
não suporta\t
uma guia literal, tente colocar uma guia literal (em muitos shells, ctrl- v tab) ou no Bash, use uma$'...'
string no estilo C (nesse caso, a barra invertida\2
precisará ser duplicada). Se você deseja manter as aspas, use em\1
vez de\2
(nesse caso, o par interno de parênteses é inútil e pode ser removido).Isso não faz nenhuma tentativa de lidar com aspas duplas escapadas dentro de aspas duplas; alguns dialetos CSV suportam isso duplicando as aspas duplas (sic).
fonte
Usando o
csvkit
utilitário (Python), por exemplo:Faz streaming, com CSV e TSV correto, citando e escapando
Está no apt e em outros gerenciadores de pacotes
fonte
Uma opção pode ser o módulo Text :: CSV do perl, por exemplo
para demonstrar
fonte
Perl
Awk
Resultado:
fonte
A solução termonuclear de mata-moscas deve estar usando o libreoffice. Enquanto https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode / sugere que isso não é possível, mas está errado (ou está desatualizado?) e o seguinte comando funciona no meu 5.3:
loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv
o
env
argumento pode ser ignorado, mas dessa forma os documentos não aparecerão no seu documento recente.fonte
Se você possui ou pode instalar o
csvtool
utilitário:Observe que, por algum motivo
csvtool
, não possui uma página de manual, mascsvtool --help
imprimirá algumas centenas de linhas de documentação.fonte
O uso
mlr
é quase sucinto, mas a desativação de cabeçalhos requer opções longas:Saída:
fonte
Eu criei um conversor de código aberto CSV para TSV que lida com as transformações descritas. É bastante rápido, pode valer a pena dar uma olhada se houver uma necessidade contínua de converter arquivos CSV grandes. A ferramenta faz parte do kit de ferramentas de utilitários TSV do eBay (documentação csv2tsv aqui ). As opções padrão são suficientes para a entrada descrita:
fonte
Vim
Apenas por diversão, as substituições regex podem ser executadas no Vim . Aqui está uma solução em potencial de quatro linhas, adaptada de: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex
As aspas são removidas.
Para criar um script da solução, as quatro linhas acima (sem dois pontos à esquerda) podem ser salvas em um arquivo, por exemplo
to_tsv.vim
. Abra cada CSV para editar com o Vim esource
oto_tsv.vim
script na linha de comando do Vim (adaptado de /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):fonte
Aqui está o exemplo de conversão de CSV em TSV usando o
jq
utilitário :ou:
No entanto, o formato CSV precisa ser bem formatado, portanto, cada sequência precisa ser citada.
Fonte: formato de saída TSV simples .
fonte
Com
perl
, supondo que os campos csv não tenham"
linhas ou guias incorporadas ou novas:fonte
A seguir, é simplesmente uma correção para a resposta do @tripleee, de modo que retire todas as aspas do campo final, assim como ocorre com todos os outros campos.
Para mostrar o que está sendo corrigido, abaixo está a resposta de um triplo , além de uma ligeira modificação nos dados de exemplo do OP com aspas adicionais ao redor do campo ' Z ' final .
Você pode ver que ' Z ' é deixado com aspas. Isso é diferente de como os campos internos são tratados. Por exemplo, o ' G ' não possui aspas.
O comando a seguir usa uma segunda substituição para limpar a coluna final:
fonte
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
são inseridos nesta resposta, eles"Z,A"
são substituídos incorretamente porZ A
, e não pelos corretosZ,A
.