Crie uma tabela de arte ASCII a partir de dados tabulares

4

Dado talvez uma entrada delimitada por vírgulas ou tabulações, gostaria de apresentar uma série de colunas adequadamente preenchidas para o stdout, para que eu possa digitalizar facilmente informações colunares que, de outra forma, seriam apresentadas de forma confusa.

Eu tentei troff -based solutions e enquanto as demos simples funcionaram, alimentar a entrada real do comando resultou em erros bizarros. No momento, recorri ao uso de um método% que é bastante lento ...

EDITAR : sed é uma ferramenta bastante útil, no entanto seria realmente incrível se as colunas tivessem, digamos, um caractere de pipe ( column ) entre eles, para que eles não pareçam "flutuar" no espaço e eu possa distinguir facilmente onde cada um começa.

PS. O título deste post costumava ler a tabela "ASCII" "', não' tabela ASCII-art '. Editado para tentar remover confusão.

    
por i336_ 09.02.2014 / 10:27

3 respostas

6

Assumindo um arquivo CSV, você pode usar column(1) assim:

column -ts, your_file

Isso está incluído no pacote bsdmainutils em minha distribuição Debian, então não tenho certeza de como é portável.

Mais duas coisas a serem observadas:

  1. O exemplo acima é simplista; explore a página man para obter mais detalhes sobre como formatar sua saída.
  2. Ele não se adapta bem aos campos citados contendo vírgulas. Ou seja, consideraria a,b,"c,d" como quatro colunas, não três.
por 09.02.2014 / 12:06
4

Isso colocará em coluna o arquivo de entrada, adicionando um caractere | para cercar cada coluna.

 sed -e 's/^/| /' -e 's/,/,| /g' -e 's/$/,|/' inputfile | column -t -s,

Exemplo de execução (usando um arquivo delimitado por dois pontos prontamente disponível):

$ head -4 /etc/passwd | tr : , | \
  sed -e 's/^/| /' -e 's/,/,| /g' -e 's/$/,|/' | column -t -s,

| root    | x  | 0  | 0  | root    | /root      | /bin/bash  |
| daemon  | x  | 1  | 1  | daemon  | /usr/sbin  | /bin/sh    |
| bin     | x  | 2  | 2  | bin     | /bin       | /bin/sh    |
| sys     | x  | 3  | 3  | sys     | /dev       | /bin/sh    |
    
por 09.02.2014 / 22:38
4

Se os dados tabulares forem lidos de alguma forma no python (neste exemplo, lendo o arquivo csv com o módulo Pandas), o módulo "tabular" é bastante útil e simples.

import pandas
from tabulate import tabulate

data = pandas.read_csv('/tmp/foo.csv', index_col=0)
print(tabulate(data, headers=data.columns, tablefmt="grid"))

O que dá uma boa saída:

+-----+------+------+
|     |    A |    B |
+=====+======+======+
| foo | 1    |  0.2 |
+-----+------+------+
| bar | 3.14 | 10.9 |
+-----+------+------+

Você pode produzir estilos diferentes

print(tabulate(data, headers=data.columns, tablefmt="fancy_grid"))

╒═════╤══════╤══════╕
│     │    A │    B │
╞═════╪══════╪══════╡
│ foo │ 1    │  0.2 │
├─────┼──────┼──────┤
│ bar │ 3.14 │ 10.9 │
╘═════╧══════╧══════╛
    
por 06.01.2017 / 04:11