Importation CSV dans des propriétés Org-mode
Question
Je voudrais importer un fichier CSV dans Org-mode. D'autres ont déjà demandé sur l'importation CSV aux tables en mode Org. Ce n'est pas ce que je suis en train de faire. Je dois importer des fichiers CSV à des propriétés Org-mode.
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:
Avez-vous connaissez un moyen facile de le faire?
La solution
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:
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
Si vous avez besoin de faire cela pour de nombreux fichiers CSV variables avec différents en-têtes et le nombre de colonnes, alors je l'approche probablement avec macros clavier .
La réponse de user310031 ferait une bonne base pour cela. La macro peut réduire la mémoire tampon pour chaque rangée, insérer la ligne d'en-tête au-dessus, effectuer l'csv-transpose
(qui semble nécessiter Mode CSV ) effectuer la recherche + remplacer, ajouter les lignes de :PROPERTIES:
et :END:
, élargir à nouveau le tampon, et laissez point sur la ligne avant la ligne suivante de données. Puis marquer simplement les lignes de données restantes comme la région, et tapez C-x C-k r .
Autres conseils
Utilisation csv mode, transposent des lignes et des colonnes par csv-transposition et le format avec remplacement-regexp:
Rechercher \(. * \), \ (. * \)
remplacer pour: : \ 1: \ 2
Vous pouvez faire quelque chose comme ça. Votre exemple est pas trop clair. S'il y a plus d'une ligne, il suffit de définir les propriétés dans la même tête à plusieurs reprises. vous pouvez utiliser le nom pour créer une nouvelle rubrique, puis définir les propriétés de la rubrique. 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))))