5

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

例如,像这样的 CSV:

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

应该变成:

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

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

4

3 回答 3

4

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

M-x replace-regexp RET \(.*\),\(.*\),\(.*\),\(.*\) RET :PROPERTIES: C-q C-j :Name: \1 C-q C-j :Tel: \2 C-q C-j :Mobile: \3 C-q C-j :Fax: \4 C-q C-j :END: RET

如果您需要对许多具有不同标题和列数的可变 CSV 文件执行此操作,那么我可能会使用键盘宏来处理它。

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

于 2011-01-17T00:57:35.430 回答
2

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

搜索\(.*\),\(.*\)

替换为::\1:\2

于 2010-04-06T13:05:56.593 回答
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))))
于 2014-12-02T01:04:10.413 回答