Конвертировать разделенные табуляцией значения в таблицу ASCII

8

Каков наиболее эффективный способ преобразования данных, разделенных табуляцией, например:

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

Нечто близкое к этому:

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

В настоящее время я использую Notepad ++ следующим образом:

  1. Преобразовать вкладки в пробелы
  2. Выровняйте данные вручную
  3. Используйте режим столбца, чтобы вставить трубы

Второй шаг - самый утомительный, и я бы предпочел автоматизировать хотя бы эту часть.

Примечание: я использую браузер при работе, и иногда у меня открыт текстовый редактор. Эффективное решение - это то, которое требует минимальных усилий. Я могу использовать:

  • Notepad ++
  • Универсальный текстовый редактор с поддержкой регулярных выражений поиск / замена
  • JavaScript набран внутри консоли браузера
  • Интернет-сервис онлайн
  • PHP в командной строке ( php -a)
Салман А
источник
4
В какой среде вы находитесь? Какие инструменты у вас есть в наличии? С кем из них вы знакомы? Какие из них вы хотите - или не хотите - использовать? Как вы определяете «эффективность» для целей этого вопроса? Вероятно, есть почти столько же способов сделать эту работу, сколько есть людей, которые хотят это сделать; Вам необходимо предоставить дополнительную информацию. Посмотрите, как задать хороший вопрос.
Джефф Цейтлин
@JeffZeitlin Я обновлю вопрос.
Салман А
Это простой awkсценарий.
Бармар
@ Barmar Я не использую awk, но я уверен, что кто-то найдет это полезным.
Салман А
задать вопрос PCG об этом - lulz будет следовать Подождите, это уже было задано ... codegolf.stackexchange.com/questions/100613/… (обратите внимание, что TSV-> CSV - это всего лишь одна разница в символах ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}кажется, достаточно хорош для работы, а?)

Ответы:

9

Как я могу преобразовать разделенные табуляцией значения в таблицу ASCII?

Я использую Генератор текстовых таблиц для такого рода задач.

Я вставил ваши данные на эту страницу, и она создала следующую таблицу:

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

Затем вы можете скопировать этот вывод (генератор выполнил большую часть тяжелой работы), вставить в notepad ++ и очистить соответствующим образом.

ДэвидПостилл
источник
5

Если вам нужно решение для командной строки, вы также можете использовать pandoc с фильтром pandoc-placetable .

Разместите вашу таблицу foo.txtи выполните:

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

Что приводит к следующему 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 |

Чтобы прочитать из STDIN, опустите --fileаргумент. Чтобы печатать в STDOUT, не указывайте -oаргумент.

MB21
источник
3

Идея Руслана об использовании команды Unix / Linux columnхороша, но приведенная в ответе командная строка не совсем работает. Прежде всего, columnне распознает \t(или \\t) в командной строке как вкладку. Если у вас есть bash, вы можете сделать

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

В противном случае вы можете сделать

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

Но даже это не отвечает на вопрос. Вы можете получить вертикальные полосы, выполнив

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

который производит вывод, как

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

Добавление штриховой линии после заголовка вручную не так утомительно.


Если у вас нет доступа к полной системе Unix / Linux, вы можете использовать Cygwin или один из других Unix-лайков для этого.

G-Man говорит: «Восстанови Монику»
источник
Вы даже не прокомментировали мой ответ, чтобы указать, что он может не сработать. Я был введен в заблуждение выводом терминала, который выровнял текст из-за того, что вкладки по умолчанию имеют 8 символов (в отличие от моей set ts=4настройки Vim ).
Руслан