Emacs:将CSV导入org-mode

时间:2009-08-06 21:25:19

标签: emacs csv import org-mode

Emacs有一个非常好的扩展名为org-mode。

我希望能够轻松地将CSV文件加载到组织模式而不会产生明显的悲痛。我所能找到的只是表格导入或表格捕获,简单地说,它甚至不能很好地工作。

请注意,我的部分问题是文字字符串,其中包含逗号。 1,2,3,4不同于1,2,3,4“。

是否有一个函数或一个可以运行的perl脚本将csv文件转换为org-mode格式?

谢谢!

5 个答案:

答案 0 :(得分:66)

从组织模式手册:

  

C-c |将活动区域转换为   表。如果每行包含至少   一个TAB字符,功能   假设材料是标签   分离。如果每行包含一个   逗号,逗号分隔值(CSV)   假设。如果不是,则分割线   在空白区域。您可以使用   强制特定的前缀参数   separator:C-u强制CSV,C-u C-u   强制TAB和数字参数N.   表示至少N连续   空格,或者TAB将是   分隔符。如果没有活动   region,此命令创建一个空   组织表。

因此,只需将数据粘贴到组织文件中,选择它,然后执行C-u C-c |

答案 1 :(得分:5)

我假设您要将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 :(得分:3)

看看:

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)

答案 3 :(得分:2)

试试这个:

;; 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 :(得分:1)

这是一个黑客工作,但它确实有效。

导出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时,我发现了一些智能宏写入的组合,而搜索替换是最简单的方法

我希望有所帮助。