Converter valores separados por tabulação em tabela ASCII

8

Qual é a maneira mais eficiente de converter dados separados por tabulação como este:

a   b   c   d   cat
NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    d   d
NULL    NULL    c   NULL    c
NULL    NULL    c   d   c; d
NULL    b   NULL    NULL    b
NULL    b   NULL    d   b; d
NULL    b   c   NULL    b; c
NULL    b   c   d   b; c; d
a   NULL    NULL    NULL    a
a   NULL    NULL    d   a; d
a   NULL    c   NULL    a; c
a   NULL    c   d   a; c; d
a   b   NULL    NULL    a; b
a   b   NULL    d   a; b; d
a   b   c   NULL    a; b; c
a   b   c   d   a; b; c; d

Algo próximo disso:

a    | b    | c    | d    | cat
-----+------+------+------+-----------
NULL | NULL | NULL | NULL | NULL
NULL | NULL | NULL | d    | d
NULL | NULL | c    | NULL | c
NULL | NULL | c    | d    | c; d
NULL | b    | NULL | NULL | b
NULL | b    | NULL | d    | b; d
NULL | b    | c    | NULL | b; c
NULL | b    | c    | d    | b; c; d
a    | NULL | NULL | NULL | a
a    | NULL | NULL | d    | a; d
a    | NULL | c    | NULL | a; c
a    | NULL | c    | d    | a; c; d
a    | b    | NULL | NULL | a; b
a    | b    | NULL | d    | a; b; d
a    | b    | c    | NULL | a; b; c
a    | b    | c    | d    | a; b; c; d

Atualmente, uso o Notepad ++ da seguinte maneira:

  1. Converter guias em espaços
  2. Alinhar os dados manualmente
  3. Use o modo de coluna para inserir os tubos

O segundo passo é o mais tedioso e eu prefiro que pelo menos essa parte seja automatizada.

Nota: Eu uso um navegador quando trabalho e às vezes tenho um editor de texto aberto ao lado. A solução eficiente é aquela que requer menos esforço. Eu posso usar:

  • Notepad ++
  • Editor de texto genérico com suporte a localizar / substituir regexp
  • JavaScript digitado no console do navegador
  • Serviço web online
  • PHP na linha de comando ( php -a)
Salman A
fonte
4
Em que ambiente você está? Quais ferramentas você tem disponível? Com quem você conhece? Quais você deseja ou não deseja usar? Como você define "eficiência" para os fins desta pergunta? Provavelmente existem quase tantas maneiras de fazer o trabalho quanto as pessoas que o querem; você precisa fornecer informações adicionais. Veja Como fazer uma boa pergunta.
precisa
@JeffZeitlin vou atualizar a pergunta.
Salman Um
É um awkscript simples .
Barmar
@ Barmar Não estou usando o awk, mas tenho certeza de que alguém o achará útil.
Salman A
faça uma pergunta sobre o PCG - lulz se seguirá. Espere, já foi solicitado ... codegolf.stackexchange.com/questions/100613/… (observe que TSV-> CSV é apenas uma única diferença de caractere ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}parece bom o suficiente para trabalhar, não é?)

Respostas:

9

Como converter valores separados por tabulação em uma tabela ASCII?

Eu uso o gerador de tabelas de texto para esse tipo de tarefa.

Colei seus dados nessa página e ele criou a seguinte tabela:

+------+------+------+------+------------+
| a    | b    | c    | d    | cat        |
+------+------+------+------+------------+
| NULL | NULL | NULL | NULL | NULL       |
+------+------+------+------+------------+
| NULL | NULL | NULL | d    | d          |
+------+------+------+------+------------+
| NULL | NULL | c    | NULL | c          |
+------+------+------+------+------------+
| NULL | NULL | c    | d    | c; d       |
+------+------+------+------+------------+
| NULL | b    | NULL | NULL | b          |
+------+------+------+------+------------+
| NULL | b    | NULL | d    | b; d       |
+------+------+------+------+------------+
| NULL | b    | c    | NULL | b; c       |
+------+------+------+------+------------+
| NULL | b    | c    | d    | b; c; d    |
+------+------+------+------+------------+
| a    | NULL | NULL | NULL | a          |
+------+------+------+------+------------+
| a    | NULL | NULL | d    | a; d       |
+------+------+------+------+------------+
| a    | NULL | c    | NULL | a; c       |
+------+------+------+------+------------+
| a    | NULL | c    | d    | a; c; d    |
+------+------+------+------+------------+
| a    | b    | NULL | NULL | a; b       |
+------+------+------+------+------------+
| a    | b    | NULL | d    | a; b; d    |
+------+------+------+------+------------+
| a    | b    | c    | NULL | a; b; c    |
+------+------+------+------+------------+
| a    | b    | c    | d    | a; b; c; d |
+------+------+------+------+------------+

Você pode copiar esta saída (o gerador fez a maior parte do trabalho duro), colar no bloco de notas ++ e limpar conforme apropriado.

DavidPostill
fonte
5

Se você precisar de uma solução de linha de comando, também poderá usar o pandoc com o filtro pandoc-placetable .

Coloque sua mesa foo.txte execute:

pandoc-placetable --file=foo.txt --delimiter="\t" --header | pandoc -f json -t markdown-simple_tables-multiline_tables -o output.md

O que resulta no seguinte output.md:

| a    | b    | c    | d    | cat        |
|------|------|------|------|------------|
| NULL | NULL | NULL | NULL | NULL       |
| NULL | NULL | NULL | d    | d          |
| NULL | NULL | c    | NULL | c          |
| NULL | NULL | c    | d    | c; d       |
| NULL | b    | NULL | NULL | b          |
| NULL | b    | NULL | d    | b; d       |
| NULL | b    | c    | NULL | b; c       |
| NULL | b    | c    | d    | b; c; d    |
| a    | NULL | NULL | NULL | a          |
| a    | NULL | NULL | d    | a; d       |
| a    | NULL | c    | NULL | a; c       |
| a    | NULL | c    | d    | a; c; d    |
| a    | b    | NULL | NULL | a; b       |
| a    | b    | NULL | d    | a; b; d    |
| a    | b    | c    | NULL | a; b; c    |
| a    | b    | c    | d    | a; b; c; d |

Para ler de STDIN, deixe de fora o --fileargumento. Para imprimir em STDOUT, deixe de fora o -oargumento.

mb21
fonte
3

A idéia de ruslan de usar o columncomando Unix / Linux é boa, mas a linha de comando dada em sua resposta não funciona muito bem. Primeiro de tudo, columnnão reconhece \t(ou \\t) na linha de comando como uma guia. Se você tiver bash, você pode fazer

column -t -s$'\t' foo.txt

Caso contrário, você pode fazer

column -t -s"$(printf '\t')" foo.txt

Mas mesmo isso não responde à pergunta. Você pode obter as barras verticais fazendo

column -t -s$'\t' -o' | ' foo.txt

que produz saída como

a    | b    | c    | d    | cat
NULL | NULL | NULL | NULL | NULL
NULL | NULL | NULL | d    | d
NULL | NULL | c    | NULL | c
NULL | NULL | c    | d    | c; d
NULL | b    | NULL | NULL | b
NULL | b    | NULL | d    | b; d
NULL | b    | c    | NULL | b; c
NULL | b    | c    | d    | b; c; d
a    | NULL | NULL | NULL | a
a    | NULL | NULL | d    | a; d
a    | NULL | c    | NULL | a; c
a    | NULL | c    | d    | a; c; d
a    | b    | NULL | NULL | a; b
a    | b    | NULL | d    | a; b; d
a    | b    | c    | NULL | a; b; c
a    | b    | c    | d    | a; b; c; d

Adicionar a linha do traço após o cabeçalho manualmente não é tão tedioso.


Se você não tem acesso a um sistema Unix / Linux completo, pode usar o Cygwin ou um dos outros gostos do Unix para isso.

G-Man diz que 'restabelece Monica'
fonte
Você nem comentou minha resposta para apontar que ela pode não funcionar. Fui enganado pela saída do terminal, que alinhava o texto devido às guias serem 8 caracteres por padrão (ao contrário da minha set ts=4configuração do Vim ).
Ruslan