Emacs: importer un CSV en mode org
Emacs a une très belle extension du nom de org-mode.
je voudrais pouvoir facilement charger des fichiers CSV en mode org sans peine significative. Tout ce que j'ai pu trouver Est table-import ou table-capture, qui, simplement dit, ne fonctionne pas même approximativement bien.
Noter qu'une partie de ma question est de chaînes de texte avec une virgule. 1,2,3,4 est différent de 1,2,"3,4".
Est-il une fonction ou un script perl que l'on pouvait exécuter pour transformer un fichier csv en format org-mode?
Merci!
5 réponses
à Partir de l'org-mode manuel:
C-c | convertir la région active en table. Si chaque ligne contient au moins un caractère de TABULATION, la fonction suppose que le matériel est onglet séparer. Si chaque ligne contient un virgule, valeurs séparées par virgule (CSV)) sont admis. Si pas, les lignes sont divisées à la les espaces dans les champs. Vous pouvez utiliser un argument de préfixe pour forcer un séparateur: forces C-u CSV, C-u C-u onglet forces, et un argument numérique N indique que au moins N consécutif espaces, ou alternativement un onglet sera séparateur. Si il n'est pas actif région, cette commande crée un vide Org table.
il suffit donc de coller les données dans un fichier org, de les sélectionner et de faire C-u C-c |
.
je suppose que vous voulez convertir votre CSV spécifiquement en mode org tableaux. Si ce n'est pas le cas, vous pouvez être plus explicite sur le format de sortie dans votre question.
quelque Chose comme ça devrait le faire, ou au moins de vous obtenir un point de départ vous pouvez pirater sur:
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new();
while ( my $line = <DATA> ) {
if ( $csv->parse( $line )) {
my $str = join '|' , $csv->fields();
print "|$str|\n";
}
}
__DATA__
1,2,3,4
1,2,"3,4"
essaye ceci:
;; Insert a file and convert it to an org table
(defun aleblanc/insert-file-as-org-table (filename)
"Insert a file into the current buffer at point, and convert it to an org table."
(interactive (list (ido-read-file-name "csv file: ")))
(let* ((start (point))
(end (+ start (nth 1 (insert-file-contents filename)))))
(org-table-convert-region start end)
))
regardez:
C-h f org-table-convert-region
je suis toujours en train de convertir csv donc j'ai ajouté ceci à mon .emacs.
(defun org-convert-csv-table (beg end)
(interactive (list (mark) (point)))
(org-table-convert-region beg end ",")
)
(add-hook 'org-mode-hook
(lambda ()
(define-key org-mode-map (kbd "<f6>") 'org-convert-csv-table)))
mise à jour
Voici une autre fonction qui considère les virgules citées aussi bien:
a,"12,12",b --> a | 12,12 |b
n'hésitez pas à l'améliorer :-).
(defun org-convert-csv-table (beg end)
; convert csv to org-table considering "12,12"
(interactive (list (point) (mark)))
(replace-regexp "\(^\)\|\(\".*?\"\)\|," (quote (replace-eval-replacement
replace-quote (cond ((equal "^" (match-string 1)) "|")
((equal "," (match-string 0)) "|")
((match-string 2))) )) nil beg end)
voici un peu d'un travail de piratage, mais il fonctionne.
lorsque vous exportez le fichier CSV, forcez les guillemets autour de chaque entrée, puis remplacez tous les ","
barre verticale.
enfin, je fais une macro qui fait quelque chose comme ça:
C-a ; Beginning-of-line
| ; Self-insert-char
C-e ; end-of-line
| ; Self-insert-char
<down> ; Down one line
(je ne suis pas sûr à 100% si | est un self-insert-char ou pas, donc de son mieux pour enregistrer votre propre macro)
appuyez sur tab quelque part au milieu de la table, et le mode org le formate correctement. Je trouve cela plus facile à faire dans un réduit région.
avertissement: si vous avez une barre verticale dans votre entrée.. ça ne marchera probablement pas très bien. De telles Situations devraient être faciles à repérer, et relativement facile à résoudre.
en général, lors de l'importation de quelque chose de texte-comme en mode org, j'ai trouvé une combinaison d'écriture macro intelligente, et search-replace pour être la manière la plus facile
j'espère que ça aide.