Emacs:将 CSV 导入 o​​rg-mode

Posted

技术标签:

【中文标题】Emacs:将 CSV 导入 o​​rg-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, &lt;newline&gt; 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 导入 o​​rg-mode的主要内容,如果未能解决你的问题,请参考以下文章

将Mongodb部分数据导入mysql数据库

数据导入导出

在 magento 中导入 csv 产品时出错

如何将csv导入mysql和mysql导出csv

CSV 导入按钮已停用。如何将 CSV 导入 Parse.com

如何将手机中的csv文件的内容导入到SQLite数据库中