Konvertieren Sie tabulatorgetrennte Werte in eine ASCII-Tabelle

8

Was ist der effizienteste Weg, um tabulatorgetrennte Daten wie diese zu konvertieren:

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

Etwas in der Nähe davon:

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

Derzeit verwende ich Notepad ++ wie folgt:

  1. Konvertieren Sie Tabulatoren in Leerzeichen
  2. Richten Sie die Daten manuell aus
  3. Verwenden Sie den Spaltenmodus, um die Rohre einzufügen

Der zweite Schritt ist der langwierigste und ich würde zumindest diesen Teil lieber automatisieren lassen.

Hinweis: Ich benutze einen Browser, wenn ich arbeite, und manchmal habe ich einen Texteditor daneben geöffnet. Die effiziente Lösung erfordert den geringsten Aufwand. Ich kann nutzen:

  • Editor ++
  • Generischer Texteditor mit Unterstützung für Regexp-Suchen / Ersetzen
  • JavaScript in der Browserkonsole eingegeben
  • Online-Webdienst
  • PHP in der Kommandozeile ( php -a)
Salman A.
quelle
4
In welcher Umgebung bist du? Welche Tools stehen Ihnen zur Verfügung? Mit welchen von denen kennen Sie? Welche sind Sie bereit oder nicht bereit zu verwenden? Wie definieren Sie "Effizienz" für die Zwecke dieser Frage? Es gibt wahrscheinlich fast so viele Möglichkeiten, die Arbeit zu erledigen, wie es Leute gibt, die dies tun wollen. Sie müssen zusätzliche Informationen bereitstellen. Siehe So stellen Sie eine gute Frage.
Jeff Zeitlin
@ JeffZeitlin Ich werde die Frage aktualisieren.
Salman A
Es ist ein einfaches awkSkript.
Barmar
@Barmar Ich benutze awk nicht, aber ich bin sicher, dass jemand anderes es nützlich finden wird.
Salman A
stelle eine PCG- Frage dazu - lulz wird folgen. Warten Sie, es wurde bereits gefragt ... codegolf.stackexchange.com/questions/100613/… (Beachten Sie, dass TSV-> CSV nur ein einziger Zeichenunterschied ist ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}scheint nett genug zu sein, um daran zu arbeiten, oder?)

Antworten:

9

Wie kann ich tabulatorgetrennte Werte in eine ASCII-Tabelle konvertieren?

Ich benutze Text Tables Generator für diese Art von Aufgabe.

Ich habe Ihre Daten auf dieser Seite eingefügt und die folgende Tabelle erstellt:

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

Sie können diese Ausgabe dann kopieren (der Generator hat die meiste harte Arbeit geleistet), in Notepad ++ einfügen und entsprechend bereinigen.

DavidPostill
quelle
5

Wenn Sie eine Befehlszeilenlösung benötigen, können Sie pandoc auch mit dem Filter pandoc-placetable verwenden .

Platzieren Sie Ihren Tisch foo.txtund führen Sie Folgendes aus:

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

Was zu folgenden Ergebnissen führt 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 |

Um aus STDIN zu lesen, lassen Sie das --fileArgument weg . Lassen Sie das -oArgument weg, um in STDOUT zu drucken .

mb21
quelle
3

Ruslans Idee , den Unix / Linux- columnBefehl zu verwenden, ist gut, aber die in ihrer Antwort angegebene Befehlszeile funktioniert nicht ganz. Erstens columnerkennt \t(oder \\t) in der Befehlszeile nicht als Registerkarte. Wenn Sie haben bash, können Sie tun

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

Ansonsten können Sie tun

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

Aber auch das beantwortet die Frage nicht. Sie können die vertikalen Balken erhalten, indem Sie dies tun

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

das erzeugt Ausgabe wie

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

Das manuelle Hinzufügen der Strichlinie nach der Kopfzeile ist nicht so mühsam.


Wenn Sie keinen Zugriff auf ein vollständiges Unix / Linux-System haben, können Sie dafür Cygwin oder eines der anderen Unix-Likes verwenden.

G-Man sagt "Reinstate Monica"
quelle
Sie haben meine Antwort nicht einmal kommentiert, um darauf hinzuweisen, dass sie möglicherweise nicht funktioniert. Ich wurde durch die Terminalausgabe irregeführt, die den Text ausrichtete, da die Registerkarten standardmäßig 8 Zeichen lang waren (im Gegensatz zu meiner Vim- set ts=4Einstellung).
Ruslan