Konwertuj wartości rozdzielane tabulatorami na tabelę ASCII

8

Jaki jest najbardziej efektywny sposób konwersji danych rozdzielanych tabulatorami, takich jak ten:

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

Coś blisko tego:

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

Obecnie używam Notepad ++ w następujący sposób:

  1. Konwertuj tabulatory na spacje
  2. Wyrównaj dane ręcznie
  3. Użyj trybu kolumny, aby wstawić rury

Drugi krok jest najbardziej uciążliwy i wolałbym przynajmniej zautomatyzować tę część.

Uwaga: korzystam z przeglądarki podczas pracy i czasami mam obok edytora tekstu. Skuteczne rozwiązanie to takie, które wymaga najmniej wysiłku. Mogę użyć:

  • Notepad ++
  • Ogólny edytor tekstowy z obsługą wyrażeń regularnych znajdź / zamień
  • JavaScript wpisany w konsoli przeglądarki
  • Usługa online
  • PHP w wierszu poleceń ( php -a)
Salman A.
źródło
4
W jakim środowisku jesteś? Jakie masz narzędzia? Które z nich znasz? Których chcesz - lub nie chcesz - użyć? Jak definiujesz „wydajność” na potrzeby tego pytania? Prawdopodobnie istnieje prawie tyle sposobów wykonania pracy, ile osób chce to zrobić; musisz podać dodatkowe informacje. Zobacz, jak zadać dobre pytanie.
Jeff Zeitlin,
@JeffZeitlin Zaktualizuję pytanie.
Salman,
To prosty awkskrypt.
Barmar,
@Barmar Nie używam awk, ale jestem pewien, że ktoś inny uzna to za przydatne.
Salman A
zadaj pytanie PCG na ten temat - nastąpi Lulz. Czekaj, to już zostało zadane ... codegolf.stackexchange.com/questions/100613/ ... (zauważ, że TSV-> CSV to tylko jedna różnica między znakami ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}wydaje się wystarczająco miły do ​​pracy, co?)

Odpowiedzi:

9

Jak przekonwertować wartości rozdzielane tabulatorami na tabelę ASCII?

Do tego rodzaju zadań używam Generatora tabel tekstowych .

Wkleiłem twoje dane na tej stronie i utworzyłem następującą tabelę:

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

Następnie możesz skopiować to wyjście (generator wykonał większość ciężkiej pracy), wkleić do notatnika ++ i odpowiednio wyczyścić.

DavidPostill
źródło
5

Jeśli potrzebujesz rozwiązania wiersza polecenia, możesz także użyć pandoc z filtrem umożliwiającym umieszczenie pandoc .

Umieść swój stolik foo.txti wykonaj:

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

Co powoduje 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 |

Aby czytać ze STDIN, pomiń --fileargument. Aby wydrukować do STDOUT, pomiń -oargument.

mb21
źródło
3

Pomysł ruslana na użycie columnkomendy Unix / Linux jest dobry, ale wiersz poleceń podany w ich odpowiedzi nie do końca działa. Przede wszystkim columnnie rozpoznaje \t(lub \\t) w wierszu poleceń jako karty. Jeśli tak bash, możesz to zrobić

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

W przeciwnym razie możesz to zrobić

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

Ale nawet to nie odpowiada na pytanie. W ten sposób możesz uzyskać pionowe paski

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

co daje wynik podobny do

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

Ręczne dodawanie linii myślnika po nagłówku nie jest tak uciążliwe.


Jeśli nie masz dostępu do pełnego systemu Unix / Linux, możesz do tego użyć Cygwin lub jednego z innych uniksowych lajków.

G-Man mówi „Przywróć Monikę”
źródło
Nie skomentowałeś nawet mojej odpowiedzi, aby zaznaczyć, że może ona nie działać. Zostałem wprowadzony w błąd przez wyjście terminala, które wyrównało tekst, ponieważ tabulatory domyślnie mają 8 znaków (w przeciwieństwie do mojego set ts=4ustawienia Vima ).
Ruslan