【问题标题】:Emacs: import a CSV into org-modeEmacs:将 CSV 导入 o​​rg-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 格式?

谢谢!

【问题讨论】:

标签: emacs csv import org-mode


【解决方案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开头,引号经常保留
        猜你喜欢
        • 2014-11-07
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多