Convertir valores separados por tabuladores a la tabla ASCII

8

¿Cuál es la forma más eficiente de convertir datos separados por tabulaciones 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 parecido a esto:

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

Actualmente uso Notepad ++ de la siguiente manera:

  1. Convertir pestañas en espacios
  2. Alinear los datos manualmente
  3. Use el modo de columna para insertar las tuberías

El segundo paso es el más tedioso y preferiría tener al menos esta parte automatizada.

Nota: uso un navegador cuando trabajo y, a veces, tengo un editor de texto abierto al lado. La solución eficiente es la que requiere menos esfuerzo. Puedo usar:

  • Notepad ++
  • Editor de texto genérico con soporte para buscar / reemplazar regexp
  • JavaScript escrito dentro de la consola del navegador
  • Servicio web en línea
  • PHP en línea de comando ( php -a)
Salman A
fuente
44
¿En qué ambiente estás? ¿Qué herramientas tienes disponibles? ¿Con cuál de ellos estás familiarizado? ¿Cuáles estás dispuesto, o no estás dispuesto a usar? ¿Cómo define "eficiencia" a los fines de esta pregunta? Probablemente hay casi tantas formas de hacer el trabajo como personas que quieren hacerlo; Necesita proporcionar información adicional. Vea cómo hacer una buena pregunta.
Jeff Zeitlin
@JeffZeitlin Actualizaré la pregunta.
Salman A
Es un awkguión simple .
Barmar
@Barmar No estoy usando awk pero estoy seguro de que alguien más lo encontrará útil.
Salman A
haga una pregunta PCG al respecto: lulz se producirá. Espera, ya se ha preguntado ... codegolf.stackexchange.com/questions/100613/… ( ten en cuenta que TSV-> CSV es solo una diferencia de char ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}parece lo suficientemente bueno para trabajar, ¿eh?)

Respuestas:

9

¿Cómo puedo convertir valores separados por tabulaciones en una tabla ASCII?

Yo uso Text Tables Generator para este tipo de tarea.

Pegué sus datos en esa página y creó la siguiente tabla:

+------+------+------+------+------------+
| 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 |
+------+------+------+------+------------+

Luego puede copiar esta salida (el generador ha realizado la mayor parte del trabajo duro), pegarla en el bloc de notas ++ y limpiar según corresponda.

DavidPostill
fuente
5

Si necesita una solución de línea de comandos, también puede usar pandoc con el filtro pandoc-placetable .

Coloque su tabla foo.txty ejecute:

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

Lo que resulta en lo siguiente 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 leer de STDIN, omita el --fileargumento. Para imprimir en STDOUT, omita el -oargumento.

mb21
fuente
3

La idea de ruslan de usar el columncomando Unix / Linux es buena, pero la línea de comando dada en su respuesta no funciona del todo. En primer lugar, columnno reconoce \t(o \\t) en la línea de comando como una pestaña. Si tienes bash, puedes hacer

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

De lo contrario, puedes hacer

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

Pero incluso eso no responde la pregunta. Puedes obtener las barras verticales haciendo

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

que produce salida 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

Agregar la línea de guión después del encabezado manualmente no es tan tedioso.


Si no tiene acceso a un sistema Unix / Linux completo, puede usar Cygwin o uno de los otros Me gusta de Unix para esto.

G-Man dice 'restablecer a Monica'
fuente
Ni siquiera comentaste mi respuesta para señalar que podría no funcionar. Fui engañado por la salida del terminal que alineó el texto debido a que las pestañas tienen 8 caracteres por defecto (a diferencia de mi set ts=4configuración de Vim ).
Ruslan