Converti valori separati da tabulazione in tabella ASCII


8

Qual è il modo più efficiente per convertire dati separati da tabulazione come questo:

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

Qualcosa di simile a questo:

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

Attualmente uso Notepad ++ come segue:

  1. Converti le schede in spazi
  2. Allinea i dati manualmente
  3. Utilizzare la modalità colonna per inserire i tubi

Il secondo passo è il più noioso e preferirei che almeno questa parte fosse automatizzata.

Nota: utilizzo un browser mentre lavoro e talvolta ho un editor di testo aperto a fianco. La soluzione efficiente è quella che richiede il minimo sforzo. Posso usare:

  • Notepad ++
  • Editor di testo generico con regexp trova / sostituisci supporto
  • JavaScript digitato nella console del browser
  • Servizio web online
  • PHP da riga di comando ( php -a)

4
In che ambiente ti trovi? Quali strumenti hai a disposizione? Con quali di questi hai familiarità? Quali siete disposti - o non disposti - a usare? Come si definisce "efficienza" ai fini di questa domanda? Probabilmente ci sono molti modi per fare il lavoro quante sono le persone che vogliono farlo; devi fornire ulteriori informazioni. Vedi Come fare una buona domanda.
Jeff Zeitlin,

@JeffZeitlin Aggiornerò la domanda.
Salman,

È una awksceneggiatura semplice .
Barmar,

@Barmar Non sto usando awk ma sono sicuro che qualcun altro lo troverà utile.
Salman,

fai una domanda al PCG al riguardo - ne conseguirà lulz. Aspetta, è già stato chiesto ... codegolf.stackexchange.com/questions/100613/… (nota che TSV-> CSV è solo una differenza di carattere singolo ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}sembra abbastanza carino su cui lavorare, eh?)

Risposte:


9

Come posso convertire valori separati da tabulazione in una tabella ASCII?

Uso Text Tables Generator per questo tipo di attività.

Ho incollato i tuoi dati su quella pagina e ho creato la seguente tabella:

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

È quindi possibile copiare questo output (il generatore ha svolto la maggior parte del duro lavoro), incollarlo in notepad ++ e ripulire come appropriato.


5

Se hai bisogno di una soluzione da riga di comando, puoi anche usare pandoc con il filtro posizionabile pandoc .

Posiziona il tuo tavolo foo.txted esegui:

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

Il risultato è il seguente 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 |

Per leggere da STDIN, lascia fuori l' --fileargomento. Per stampare su STDOUT, tralasciare l' -oargomento.


3

L'idea di ruslan di usare il columncomando Unix / Linux è buona, ma la riga di comando fornita nella loro risposta non funziona del tutto. Prima di tutto, columnnon riconosce \t(o \\t) nella riga di comando come una scheda. Se hai bash, puoi farlo

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

Altrimenti, puoi farlo

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

Ma anche questo non risponde alla domanda. Puoi ottenere le barre verticali facendo

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

che produce un output simile

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

Aggiungere la linea tratteggiata dopo l'intestazione manualmente non è così noioso.


Se non hai accesso a un sistema Unix / Linux completo, puoi usare Cygwin o uno degli altri Mi piace di Unix per questo.


Non hai nemmeno commentato la mia risposta per sottolineare che potrebbe non funzionare. Sono stato fuorviato dall'output del terminale che ha allineato il testo a causa delle schede di 8 caratteri per impostazione predefinita (a differenza della mia set ts=4impostazione Vim ).
Ruslan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.