我想将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:
你碰巧知道一种无痛的方法吗?
答案 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))))