Emacs:将CSV导入org-mode

Pau*_*han 43 csv emacs import org-mode

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

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

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

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

谢谢!

Don*_*ick 70

从组织模式手册:

抄送| 将活动区域转换为表格.如果每行包含至少一个TAB字符,则该函数假定材料是制表符分隔的.如果每行包含逗号,则假定使用逗号分隔值(CSV).如果不是,则将行在空白处拆分为字段.您可以使用前缀参数强制使用特定分隔符:Cu强制CSV,Cu Cu强制TAB和数字参数N表示至少N个连续空格,或者TAB将是分隔符.如果没有活动区域,则此命令将创建一个空的Org表.

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

  • 以防万一(像我一样)你的键绑定被搞砸了和Cu Cc | 不工作,调用的直接函数(选择要转换的区域后)是*Mx org-table-convert-region* (7认同)
  • 当您有包含逗号的 CSV 字段时不起作用,OP 指定了... (4认同)
  • @DonWomick如果数据的逗号和换行符用双引号括起来,这不起作用:`a,b,c,"def,<newline> ghi"` (2认同)
  • 上面的评论是正确的,除非我遗漏了什么。@DonWomick 的答案没有回答OP关于用引号引起来的逗号和换行符的问题。当 csv 字段的引号中包含逗号/换行符时,如何转换为表格? (2认同)

gen*_*ack 5

我假设您要将CSV专门转换为组织模式.如果情况并非如此,您可能希望在问题中更明确地了解输出格式.

这样的事情应该这样做,或者至少为你提供一个你可以破解的起点:

  #!/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"
Run Code Online (Sandbox Code Playgroud)


DJJ*_*DJJ 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)))
Run Code Online (Sandbox Code Playgroud)

更新

这是另一个考虑引用逗号的函数:

 a,"12,12",b --> a | 12,12 |b
Run Code Online (Sandbox Code Playgroud)

随时改进它:-)。

(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)
Run Code Online (Sandbox Code Playgroud)