plan - Emacs: importa un archivo CSV en modo orgánico
modo organico y sistematico (5)
Emacs tiene una muy buena extensión con el nombre de org-mode.
Me gustaría poder cargar fácilmente archivos CSV en modo orgánico sin gran dolor. Todo lo que he podido encontrar es importación de tabla o captura de tabla, que, en pocas palabras, no funciona ni siquiera aproximadamente.
Tenga en cuenta que parte de mi problema son las cadenas de texto con una coma dentro de ellas. 1,2,3,4 es diferente a 1,2, "3,4".
¿Existe una función o un script de Perl que se podría ejecutar para transformar un archivo csv en formato org-mode?
¡Gracias!
Aquí hay un poco de trabajo de hackeo, pero funciona.
cuando exporte el archivo CSV, fuerce las comillas alrededor de cada entrada, luego reemplace todo ","
como una barra vertical.
Finalmente, hago una macro que hace algo como esto:
C-a ; Beginning-of-line
| ; Self-insert-char
C-e ; end-of-line
| ; Self-insert-char
<down> ; Down one line
(No estoy 100% seguro de que | sea una inserción automática o no, por lo que es mejor grabar su propia macro)
Pulse la pestaña en algún lugar en el medio de la tabla, y org-mode lo formatea correctamente. Encuentro esto más fácil de hacer en una región estrecha.
Advertencia: si tiene una barra vertical en su entrada ... probablemente no funcionará del todo bien. Situaciones como esa deberían ser fáciles de detectar y relativamente fáciles de arreglar.
En general, al importar algo parecido a un texto en org-mode, he encontrado una combinación de escritura de macro inteligente y búsqueda-reemplazo para ser la forma más fácil
Espero que eso ayude.
Del manual de org-mode:
Cc | Convierta la región activa a la tabla. Si cada línea contiene al menos un carácter TAB, la función asume que el material está separado por tabuladores. Si cada línea contiene una coma, se suponen los valores separados por comas (CSV). Si no, las líneas se dividen en espacios en blanco en campos. Puede usar un argumento de prefijo para forzar un separador específico: Cu fuerza CSV, Cu Cu fuerza TAB, y un argumento numérico N indica que al menos N espacios consecutivos, o alternativamente, una TAB será el separador. Si no hay una región activa, este comando crea una tabla de organización vacía.
Así que simplemente pegue los datos en un archivo org, selecciónelo y realice Cu Cc |
.
Mira esto:
Ch f org-table-convert-region
Siempre estoy convirtiendo csv así que agregué esto a mis .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)))
actualizar
Aquí hay otra función que considera las comillas también:
a,"12,12",b --> a | 12,12 |b
siéntete libre de mejorarlo :-).
(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)
Prueba esto:
;; 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)
))
Supongo que quieres convertir tu CSV específicamente en tablas de modo orgánico . Si ese no es el caso, es posible que desee ser más explícito sobre el formato de salida en su pregunta.
Algo como esto debería hacerlo, o al menos obtener un punto de partida que puede piratear:
#!/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"