Emacs:将 CSV 导入 org-mode
Posted
技术标签:
【中文标题】Emacs:将 CSV 导入 org-mode【英文标题】:Emacs: import a CSV into org-mode 【发布时间】:2010-11-17 12:21:11 【问题描述】:Emacs 有一个很好的扩展名为 org-mode。
我希望能够轻松地将 CSV 文件加载到 org 模式中,而不会感到非常悲伤。我所能找到的只是 table-import 或 table-capture,简而言之,它们甚至不能很好地工作。
请注意,我的部分问题是其中带有逗号的文本字符串。 1,2,3,4 与 1,2,"3,4" 不同。
是否有可以运行的函数或 perl 脚本将 csv 文件转换为 org-mode 格式?
谢谢!
【问题讨论】:
看看 Neil Butterworth 的 code.google.com/p/csvfix。它具有 CSV->XML 转换,所以也许您可以将其用作解决方案的一部分。 只有部分相关,但对于尚未了解 CSV 呈现的边缘案例数量的任何人来说仍然值得一读:tburette.github.io/blog/2014/05/25/… 【参考方案1】:我假设您想将您的 CSV 专门转换为 org-mode 表格。如果不是这种情况,您可能希望在问题中更明确地说明输出格式。
这样的事情应该可以做到,或者至少给你一个可以破解的起点:
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new();
while ( my $line = <DATA> )
if ( $csv->parse( $line ))
my $str = join '|' , $csv->fields();
print "|$str|\n";
__DATA__
1,2,3,4
1,2,"3,4"
【讨论】:
【参考方案2】:来自组织模式手册:
C-c |将活动区域转换为 桌子。如果每一行至少包含 一个 TAB 字符,函数 假定材料是制表符 分开。如果每一行都包含一个 逗号,逗号分隔值 (CSV) 假定。如果不是,则行被拆分 在空白处进入字段。您可以使用 强制特定的前缀参数 分隔符:C-u 强制 CSV,C-u C-u 强制 TAB 和一个数字参数 N 表示至少 N 个连续的 空格,或者一个 TAB 将是 分隔符。如果没有活动 区域,此命令创建一个空的 组织表。
所以只需将数据粘贴到 org 文件中,选择它,然后执行 C-u C-c |
。
【讨论】:
当您的 CSV 字段包含 OP 指定的逗号时不起作用... 即使自动检测(不带前导 C-u)也适用于在(引用的)值中嵌入逗号的 CSV。 以防万一(像我一样)你的键绑定被搞砸了 C-u C-c |不起作用,调用的直接函数(选择要转换的区域后)是 M-x org-table-convert-region @DonWomick 如果数据的逗号和换行符用双引号括起来,这将不起作用:a,b,c,"def, <newline> ghi"
以上评论是对的,除非我遗漏了什么。 @DonWomick 的答案没有回答 OP 关于逗号和换行符用引号括起来的问题。当 csv 字段的引号中包含逗号/换行符时,如何转换为表格?【参考方案3】:
试试这个:
;; Insert a file and convert it to an org table
(defun aleblanc/insert-file-as-org-table (filename)
"Insert a file into the current buffer at point, and convert it to an org table."
(interactive (list (ido-read-file-name "csv file: ")))
(let* ((start (point))
(end (+ start (nth 1 (insert-file-contents filename)))))
(org-table-convert-region start end)
))
【讨论】:
【参考方案4】:这是一个小技巧,但它确实有效。
当您导出 CSV 文件时,强制在每个条目周围加上引号,然后将所有 ","
替换为竖线。
最后,我做了一个宏来做这样的事情:
C-a ; Beginning-of-line
| ; Self-insert-char
C-e ; end-of-line
| ; Self-insert-char
<down> ; Down one line
(我不能 100% 确定 | 是否是自插入字符,所以最好记录自己的宏)
点击表格中间某处的选项卡,然后 org-mode 会正确格式化它。我发现在狭窄的区域更容易做到这一点。
警告:如果您的输入中有竖线.. 它可能无法正常工作。这样的情况应该很容易发现,并且相对容易修复。
一般来说,当将一些类似文本的东西导入 org-mode 时,我发现一些智能宏编写和 search-replace 的组合是最简单的方法
希望对你有帮助。
【讨论】:
【参考方案5】:看看:
C-h f org-table-convert-region
我一直在转换 csv,所以我将它添加到我的 .emacs 中。
(defun org-convert-csv-table (beg end)
(interactive (list (mark) (point)))
(org-table-convert-region beg end ",")
)
(add-hook 'org-mode-hook
(lambda ()
(define-key org-mode-map (kbd "<f6>") 'org-convert-csv-table)))
更新
这是另一个考虑引号的函数:
a,"12,12",b --> a | 12,12 |b
随时改进它:-)。
(defun org-convert-csv-table (beg end)
; convert csv to org-table considering "12,12"
(interactive (list (point) (mark)))
(replace-regexp "\\(^\\)\\|\\(\".*?\"\\)\\|," (quote (replace-eval-replacement
replace-quote (cond ((equal "^" (match-string 1)) "|")
((equal "," (match-string 0)) "|")
((match-string 2))) )) nil beg end)
【讨论】:
试过你的功能,每一行都以nil
开头,引号经常保留以上是关于Emacs:将 CSV 导入 org-mode的主要内容,如果未能解决你的问题,请参考以下文章