我想将 CSV 导入组织模式。其他人已经询问过将 CSV 导入 Org-mode 表的问题。这不是我想要做的。我需要将 CSV 导入组织模式属性。
例如,像这样的 CSV:
Name,Tel,Mobile,Fax
John,11111,22222,33333
应该变成:
:PROPERTIES:
:Name: John
:Tel: 11111
:Mobile: 22222
:Fax: 33333
:END:
你碰巧知道一种无痛的方法吗?
我能看到的最简单的方法是将数据行标记为区域,然后使用正则表达式搜索和替换:
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.
使用 csv 模式,通过 csv-transpose 转置行和列,并使用 replace-regexp 进行格式化:
搜索\(.*\),\(.*\)
替换为::\1:\2
你可以做这样的事情。你的例子不太清楚。如果不止一行,它只会一遍又一遍地设置同一个标题中的属性。您可能希望使用名称来创建新标题,然后在标题上设置属性。下面的代码适用于格式良好的 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))))