将制表符分隔的值转换为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. 使用列模式插入管道

第二步是最繁琐的一步,我宁愿至少将此部分自动化。

注意:我在工作时使用浏览器,有时会同时打开文本编辑器。一种有效的解决方案是需要最少工作量的解决方案。我可以用:

  • 记事本++
  • 具有regexp查找/替换支持的通用文本编辑器
  • 在浏览器控制台中键入JavaScript
  • 在线网络服务
  • 命令行中的PHP(php -a

4
你在什么环境?您有哪些可用工具?您对其中哪些熟悉?您愿意或不愿意使用哪些?为了这个问题,您如何定义“效率”?做这项工作的方式可能几乎和想做这项工作的人一样多。您需要提供其他信息。请参阅 如何提出一个好问题。
杰夫·齐特林

@JeffZeitlin我将更新问题。
Salman A

这是一个简单的awk脚本。
Barmar

@Barmar我没有使用awk,但我相信其他人会发现它有用。
Salman A

询问有关PCG的问题-随后会发生lulz。等一下,已经有人问过了…… codegolf.stackexchange.com/questions/100613 / … (请注意,TSV-> CSV只是一个字符差异... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}看起来足够好了,是吗?)

Answers:


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

如果需要命令行解决方案,还可以将pandocpandoc-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参数。


3

ruslan使用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的软件之一。


您甚至没有对我的回答发表评论以指出它可能不起作用。由于默认情况下制表符为8个字符(与我的Vim set ts=4设置不同),终端输出使文本对齐使我感到困惑。
罗斯兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.