转换制表符分隔数据的最有效方法是什么,例如:
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++ 如下:
- 将制表符转换为空格
- 手动对齐数据
- 使用列模式插入管道
第二步是最繁琐的一步,我宁愿至少将这一部分自动化。
注意:我工作时会使用浏览器,有时也会打开文本编辑器。最有效的解决方案是需要最少努力的解决方案。我可以使用:
- 记事本++
- 具有正则表达式查找/替换支持的通用文本编辑器
- 在浏览器控制台中输入 JavaScript
- 在线网络服务
- 命令行上的 PHP (
php -a
)
答案1
如何将制表符分隔的值转换为 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++ 中并进行适当清理。
答案2
如果你需要命令行解决方案,你也可以使用潘多克与pandoc 可放置过滤器。
放置你的表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/Linuxcolumn
命令是一个很好的例子,但他们的答案中给出的命令行不太好用。首先,
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 系统来实现此目的。