51

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

我希望能够轻松地将 CSV 文件加载到 org-mode 中,而不会感到非常悲伤。我所能找到的只是表格导入或表格捕获,简单地说,它们甚至不能很好地工作。

请注意,我的部分问题是其中带有逗号的文本字符串。1,2,3,4 与 1,2,"3,4" 不同。

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

谢谢!

4

5 回答 5

85

从组织模式手册:

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

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

于 2009-08-07T15:01:31.987 回答
5

I'm assuming you want to convert your CSV specifically into org-mode tables. If that's not the case, you may want to be more explicit about output format in your question.

Something like this should do it, or at least get you a starting point you can hack on:

  #!/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"
于 2009-08-07T01:43:12.257 回答
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)
于 2015-09-02T12:31:31.513 回答
4

尝试这个:

;; 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)
    ))
于 2009-09-11T14:59:33.230 回答
2

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

当您导出 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 的组合是最简单的方法

我希望这会有所帮助。

于 2009-09-11T19:15:11.977 回答