2010-04-06 7 views
4

Je souhaite importer un fichier CSV en mode Org. D'autres ont déjà demandé l'importation de CSV dans des tables en mode Org. Ce n'est pas ce que j'essaie de faire. J'ai besoin d'importer CSV aux propriétés en mode Org.Importer un fichier CSV en mode Org

Par exemple, un fichier CSV comme ceci:

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

devrait devenir:

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

Est-ce que vous connaissez un moyen facile de le faire?

+0

Pourquoi voudriez-vous convertir ces valeurs en balises? – Mica

+0

les valeurs de propriété sont différentes des étiquettes. – lecodesportif

Répondre

3

l'approche la plus simple que je peux voir est de marquer les lignes de données que la région, puis utiliser une recherche regexp et remplacer:

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

Si vous avez besoin de faire pour de nombreux fichiers CSV variables avec différents en-têtes et nombres de colonnes, alors je l'approcherais probablement avec keyboard macros.

La réponse de l'utilisateur310031 constituerait une bonne base pour cela. La macro peut réduire le tampon à chaque ligne, insérer la ligne d'en-tête au-dessus, exécuter le (qui semble exiger CSV mode) faire la recherche + remplacer, ajouter dans les lignes :PROPERTIES: et :END:, élargir à nouveau le tampon, et laisser le point sur la ligne avant la prochaine ligne de données. Ensuite, marquez simplement les lignes de données restantes en tant que région et tapez C-x C-k r.

2

utilisation csv mode, transposent des lignes et des colonnes par csv-transposition et le format de remplacement-regexp: (. * \) (. * \)

recherche \, \

remplacent pour : : \ 1: \ 2

0

Vous pouvez faire quelque chose comme ceci. Votre exemple n'est pas trop clair. S'il y a plus d'une ligne, il suffit de définir les propriétés dans le même en-tête encore et encore. vous pouvez utiliser le nom pour créer un nouvel en-tête, puis définir les propriétés sur l'en-tête. le code ci-dessous fonctionne pour les fichiers csv assez bien formatés.

(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)))) 
Questions connexes