2010-04-06 78 views
4

我想將CSV導入組織模式。其他人已經詢問如何將CSV導入組織表模式。這不是我想要做的。我需要將CSV導入組織模式屬性。將CSV導入組織模式屬性

例如,CSV這樣的:

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

應該變成:

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

你碰巧知道無痛的方式做到這一點?

+0

你爲什麼要把這些值變成標籤? – Mica 2010-04-06 16:12:05

+0

屬性值與標籤不同。 – lecodesportif 2010-04-06 21:58:38

回答

3

我可以看到的最簡單的方法是標記數據行作爲區域,然後使用一個正則表達式的搜索和替換:

的Mxreplace-regexpRET\(.*\),\(.*\),\(.*\),\(.*\)RET:PROPERTIES:CQ CJ:Name: \1CQ CJ:Tel: \2CQ CJ:Mobile: \3CQ CJ:Fax: \4CQ CJ:END:RET

如果你需要做的這對於許多可變的CSV文件具有不同的標題和列數,那麼我可能會用keyboard macros來處理它。

user310031的回答將爲此奠定良好的基礎。宏可以將緩衝區縮小到每一行,在其上面插入標題行,執行csv-transpose(這看起來需要CSV mode)執行搜索+替換,在:PROPERTIES::END:行中添加,再次擴大緩衝區,然後離開點行之前下一個數據行。然後,將剩餘的數據行標記爲區域,並鍵入C-x C-k r

2

使用CSV模式,轉置行和列由CSV-轉置和格式以replace-regexp的:(。* \)(。* \)

搜索\,\

替換爲::\ 1:\ 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))))