在命令行用 Org mode 表格展示 CSV 数据

csv-to-org-table 文件的内容:

使用举例:

~$ echo foo,bar,baz | csv-to-org-table
|-----+-----+-----|
| foo | bar | baz |
|-----+-----+-----|

或用个 org-agenda 的例子:

~$ emacs --batch --load ~/.emacs.d/init.el --eval '(org-batch-agenda-csv "i")' | csv-to-org-table
|-------+-------------------------------------------------------+-----------+------+---+---+---+---+---+------+---|
| inbox | View org-agenda from the command line (outside Emacs) | tagsmatch | DONE |   |   |   |   |   | 1000 |   |
| inbox | Show CSV as Org mode table from the command line      | tagsmatch | TODO |   |   |   |   |   | 1000 |   |
| inbox | Is it possible to run org code block from shell?      | tagsmatch | TODO |   |   |   |   |   | 1000 |   |
| inbox | Extract headings of org mode files in shell           | tagsmatch | TODO |   |   |   |   |   | 1000 |   |
|-------+-------------------------------------------------------+-----------+------+---+---+---+---+---+------+---|
7 个赞

默认有 999 行的限制:

Region is longer than ‘org-table-convert-region-max-lines’ (999) lines; not converting

实测 3000多行(100k) 的文件性能也还可以:

$ cat ./address.csv | time csv-to-org-table
|---------+--------------------------------+---+-------|
|     111 | 北京                           | 1 |     0 |
|     112 | 天津                           | 1 |     0 |
|     113 | 河北                           | 1 |     0 |
|     114 | 山西                           | 1 |     0 |
|     115 | 内蒙古                         | 1 |     0 |
|     121 | 辽宁                           | 1 |     0 |
|     122 | 吉林                           | 1 |     0 |
|     123 | 黑龙江                         | 1 |     0 |
|     131 | 上海                           | 1 |     0 |
...
| 1651399 | 其他区县                       | 3 | 16513 |
|    2617 | 阿勒泰市                       | 3 | 16514 |
| 1651402 | 布尔津县                       | 3 | 16514 |
| 1651403 | 富蕴县                         | 3 | 16514 |
| 1651404 | 福海县                         | 3 | 16514 |
| 1651405 | 哈巴河县                       | 3 | 16514 |
| 1651406 | 青河县                         | 3 | 16514 |
| 1651407 | 吉木乃县                       | 3 | 16514 |
| 1651499 | 其他区县                       | 3 | 16514 |
|---------+--------------------------------+---+-------|

        1.28 real         0.70 user         0.08 sys

(1- num)竟然是num-1,已经有了(- num 1)为什么还会存在这个函数。。

简写形式,好写。。。和 ++1 1++ 不是一样的道理

@tumashu 的论断举个例子:

(mapcar #'1- '(1 2 3))
     => (0 1 2)

(mapcar (lambda (elt) (- elt 1)) '(1 2 3))
     => (0 1 2)

另外,可能 -11- 要合理些,但是 -1 是个数字,且不能作为函数名。

  1. 少敲几个字。
  2. 1- 相对用 - 有特别优化,速度快一点。

不 byte-compile 的话或许是的,如果 byte-compile 的话就完全不存在这个差别了,因为 byte-compiler 知道 (+ x 1) 的意思是 (1+ x)

(byte-compile (lambda (x) (+ x 1)))
     => #[(x) "T\207" [x] 1]

(byte-compile (lambda (x) (1+ x)))
     => #[(x) "T\207" [x] 1]

无论如何,我觉得使用 (+ x 1) 还是 (1+ x) 是个代码风格问题,看个人喜好而定,比方说如果遇到有人刻意避免使用 1+ 也不必惊讶。

1 个赞

请问这如何让命令行生效呢?

添加可执行权限(chmod +x),前提是你的操作系统支持全分解 Shebang,比如 macOS 支持,Linux 应该不支持,不支持的话,直接用 emacs 调用脚本,用

$ echo foo,bar,baz | emacs --batch --load path/to/csv-to-org-table
1 个赞

感谢大佬呀 :pray: