2009-08-06 14 views
37

Emacs tiene una extensión muy bonita con el nombre de org-mode.Emacs: importe un archivo CSV en el modo orgánico

Me gustaría ser capaz de cargar fácilmente archivos CSV en modo org sin mucho 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 alguna función o un script en perl que se pueda ejecutar para transformar un archivo csv en formato org-mode?

Gracias!

+0

Eche un vistazo si http://code.google.com/p/csvfix/ por Neil Butterworth. Tiene conversión CSV-> XML, así que tal vez podrías usar eso como parte de la solución. –

+0

Solo lectura parcialmente relacionada, pero que todavía vale la pena para cualquiera que no esté al tanto del número de casos extremos que presenta CSV: https://tburette.github.io/blog/2014/05/25/so-you-want- to-write-your-own-CSV-code/ – sampablokuper

Respuesta

5

Supongo que quiere convertir su CSV específicamente en org-mode tablas. Si ese no es el caso, es posible que desee ser más explícito sobre el formato de salida en su pregunta.

Algo así debe hacerlo, o al menos conseguir un punto de partida se puede cortar en:

#!/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" 
53

Del manual en modo org:

C-C | 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 la lengüeta . 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 los campos. Puede utilizar un argumento prefijo para forzar una específica separador: fuerzas C-u CSV, Cu-Cu- fuerzas TAB, y un argumento numérico N indica que al menos N consecutivos espacios, o, alternativamente, una pestaña se 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 haga C-u C-c |.

+0

Hmm, parece que las ligaduras "fi" en el PDF se eliminaron de la cita anterior ... de todos modos ... "campos" deberían ser "campos", "específicos" "debe ser" específico "y" prex "debe ser" prefijo ". –

+1

No funciona cuando tiene campos CSV que contienen comas, que el OP especifica ... – genehack

+0

C-u C-c | trabajado para mí con archivos de coma. – tenpn

1

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) 
    )) 
1

Aquí es un poco de un corte del puesto de trabajo, pero funciona.

cuando exporta el archivo CSV, forza las comillas alrededor de cada entrada, luego reemplaza todo "," como una barra vertical.

Por último, 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 si | es un self-insert-char o no, así que es mejor para grabar su propia macro)

Pulse la pestaña en algún lugar en el medio de la tabla, y org-mode 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, cuando se importa texto algo parecido en org-mode, he encontrado una combinación de algunos de escritura macro inteligente y buscar-reemplazar a ser la forma más fácil

Espero que ayude.

2

Tenga una mirada en:

C-h f org-table-convert-region

Siempre estoy convirtiendo csv por lo que añade 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))) 

actualización

Aquí es otra función que tiene en cuenta las comas citados, así:

a,"12,12",b --> a | 12,12 |b 

sentir la libertad de mejorarla :-).

(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) 
Cuestiones relacionadas