将CSV导入Org-mode属性

时间:2010-04-06 00:24:41

标签: emacs csv org-mode elisp

我想将CSV导入Org-mode。其他人已经询问过将CSV导入Org模式表。那不是我想要做的。我需要将CSV导入Org-mode属性。

例如,像这样的CSV:

Name,Tel,Mobile,Fax
John,11111,22222,33333

应该成为:

:PROPERTIES:
:Name: John
:Tel: 11111
:Mobile: 22222
:Fax: 33333
:END:

你碰巧知道一种无痛的方法吗?

3 个答案:

答案 0 :(得分:4)

我能看到的最简单的方法是将数据行标记为区域,然后使用正则表达式搜索并替换:

Mx replace-regexp RET \(.*\),\(.*\),\(.*\),\(.*\) RET :PROPERTIES: Cq Cj :Name: \1 Cq Cj :Tel: \2 Cq Cj :Mobile: \3 Cq Cj :Fax: \4 Cq Cj :END: RET

如果您需要对包含不同标题和列数的许多变量CSV文件执行此操作,那么我可能会使用keyboard macros来处理它。

user310031的答案将为此提供良好的基础。宏可以将缓冲区缩小到每一行,在其上方插入标题行,执行csv-transpose(似乎需要CSV mode)执行搜索+替换,添加:PROPERTIES::END:行,再次加宽缓冲区,并在之前将点留在下一个数据行。然后将剩余的数据行标记为区域,并键入 C-x C-k r

答案 1 :(得分:2)

使用csv-mode,通过csv-transpose转置行和列,并使用replace-regexp格式化:

搜索 \(。* \),\(。* \)

替换为::\ 1:\ 2

答案 2 :(得分:0)

你可以这样做。你的例子不太清楚。如果有多行,则只会在同一个标​​题中反复设置属性。您可能希望使用“名称”创建新标题,然后在标题上设置属性。下面的代码适用于格式良好的csv文件。

(let ((lines (with-temp-buffer
               (insert-file-contents "data.csv")
               (split-string (buffer-string) "\n")))
      (properties)
      (values))

  (setq properties (split-string (car lines) ","))

  (loop for line in (cdr lines)
        do
        (setq values (split-string line ","))
        (loop for property in properties
              for value in values
              do
              (org-entry-put (point) property value))))