¿Convertir un archivo xls al modo org?


8

¿Es posible convertir convertir un xlsarchivo en una orgtabla? Encontré este artículo en el wiki de emacs pero no pude hacerlo funcionar.



@lawlist Como mencioné en la pregunta, soy consciente de UnXls pero no he podido hacer que funcione.
Brian Fitzpatrick

Creo que eso es todo, es decir, el hilo que vinculé y la wiki de Emacs. No creo que exista nada más. Probablemente guardaría la hoja de cálculo como algo así como un archivo de texto delimitado por tabulaciones con Microsoft Excel, y luego haría lo que quisiera con las palabras clave de datos.
leyes

Respuestas:


6

Guarde el archivo como un archivo delimitado por tabulaciones (usando Excel o el localccomando mencionado en la respuesta de @ YoungFrog). Luego, ejecute org-table-importen el punto donde desea insertar la tabla.


Cambié esto a la respuesta aceptada. Todas las respuestas funcionan pero esta es la más rápida. ¡Gracias!
Brian Fitzpatrick

org-table-importestá bien para archivos csv simples, pero se romperá si una celda contiene una nueva línea (que es el caso para mí).
YoungFrog

6

Dado que está utilizando Excel, también podría estar interesado en otras herramientas para trabajar con datos estadísticos. Así es como puede usar el lenguaje de programación R para importar un archivo XSL al modo Org de Emacs:

* Import XLS File Using R
  Install =gdata= package (you need to only run it once unles you already
  have this package installed).  The code below is meant to get you started
  with just this file and nothing else, but generally, you'd simply run
  =install.packages("gdata")= from ESS session to install the package.
  The reason you can't do it here is that by default =install.packages= will
  try to install into location found in =.libPaths()=, which is likely to
  require super-user permissions.

  #+begin_src R :var tmpdir="/tmp"
    firstpath <- .libPaths()[1]
    .libPaths(c(firstpath, tmpdir))
    install.packages("gdata", lib = tmpdir, repos = "http://cran.rstudio.com/")
    library(gdata)
    read.xls("example.xls")
  #+end_src

  #+RESULTS:
  |         | Created with Microsoft Excel 2003 SP1 |
  |       X |                                     Y |
  | 0.42491 |                               0.15039 |
  | 0.03927 |                               0.54603 |
  |    some |                     rows were skipped |
  | 0.72372 |                               0.78759 |
  | 0.73772 |                               0.97298 |
  | 0.35374 |                               0.38789 |

  Or, open the ESS session by executing =M-x R=, then type into the
  R console (your input starts with `>' symbol, you don't need to type the
  symbol itself).  Answer the prompts by typing `y' or `n'.

  #+begin_example
  > install.packages("gdata")
  Installing package into ‘/usr/lib64/R/library’
  (as ‘lib’ is unspecified)
  Warning in install.packages("gdata") :
  'lib = "/usr/lib64/R/library"' is not writable
  Would you like to use a personal library instead?  (y/n) y
  Would you like to create a personal library
  ~/R/x86_64-redhat-linux-gnu-library/3.2
  to install packages into?  (y/n) y
  --- Please select a CRAN mirror for use in this session ---
  <install log skipped>
  ,** building package indices
  ,** installing vignettes
  ,** testing if installed package can be loaded
  ,* DONE (gdata)

  The downloaded source packages are in
  ‘/tmp/RtmpMiDPfR/downloaded_packages’
  #+end_example

  Load the XLS file and output an Org table:

  #+begin_src R
    library(gdata)
    read.xls("example.xls")
  #+end_src

  #+RESULTS:
  |         | Created with Microsoft Excel 2003 SP1 |
  |       X |                                     Y |
  | 0.42491 |                               0.15039 |
  | 0.03927 |                               0.54603 |
  |    some |                     rows were skipped |
  | 0.72372 |                               0.78759 |
  | 0.73772 |                               0.97298 |
  | 0.35374 |                               0.38789 |

Este es el archivo XLS de ejemplo que utilicé http://berkeleycollege.edu/browser_check/samples/excel.xls

Deberá instalar el paquete ESS para interactuar con R desde Emacs, así como con el lenguaje R mismo. Mira aquí: http://ess.r-project.org/Manual/ess.html#Installation para obtener instrucciones (o simplemente hazlo M-xpackage-installRETESS). Deberá habilitar R en los bloques de código de Org Babel agregando esto a su archivo de inicio de Emacs:

(org-babel-do-load-languages
  'org-babel-load-languages '((R . t)))

Para instalar R, mira aquí: http://cran.r-project.org/doc/manuals/r-release/R-admin.html#Installation , pero estas instrucciones están destinadas a aquellos que desean construir el lenguaje en los suyos Por lo general, puede instalarlo en Linux utilizando su administrador de paquetes, por ejemplo. apt-get install Ro yum install Retc. También hay binarios para otras plataformas, por ejemplo: los binarios de MS Windows se pueden encontrar aquí: http://cran.r-project.org/bin/windows/base/


4

Esto es lo que hago. No es ideal, sino un tipo de obras. Primero, uso LibreOffice Calc para convertir a CSV:

localc --convert-to csv --headless filename

Luego uso pcsv.el (un analizador CSV) para convertir de CSV a Lisp, luego inserto el resultado como una tabla de modo Org:

(defun yf/lisp-table-to-org-table (table &optional function)
  "Convert a lisp table to `org-mode' syntax, applying FUNCTION to each of its elements.
The elements should not have any more newlines in them after
applying FUNCTION ; the default converts them to spaces. Return
value is a string containg the unaligned `org-mode' table."
  (unless (functionp function)
    (setq function (lambda (x) (replace-regexp-in-string "\n" " " x))))
  (mapconcat (lambda (x)                ; x is a line.
               (concat "| " (mapconcat function x " | ") " |"))
             table "\n"))
(defun yf/csv-to-table (beg end &optional separator)
  "Convert from BEG to END (a region in csv format) to an
`org-mode' table."
  (interactive
   (list
    (region-beginning)
    (region-end)
    (when current-prefix-arg
      (string-to-char (read-from-minibuffer "Separator? ")))))
  (require 'pcsv)
  (insert
   (yf/lisp-table-to-org-table
    (let
        ((pcsv-separator (or separator pcsv-separator)))
      (pcsv-parse-region beg end))))
  (delete-region beg end)
  (org-table-align))
(defun yf/insert-csv-as-table (filename &optional separator)
  "Insert a csv file as a org-mode table."
  (interactive
   (list
    (read-file-name "CSV file: ")
    (when current-prefix-arg
      (string-to-char
       (read-from-minibuffer "Separator? ")))))
  (yf/csv-to-table (point)
                   (progn (forward-char
                           (cadr (insert-file-contents filename)))
                          (point))
                   separator))

Es un poco largo debido a cómo factoricé las funciones. Lo que necesitamos aquí es yf/insert-csv-as-table.


1

Supongo que primero debes convertir tu XLS a CSV.

Quiero evitar importar varios CSV al modo Org, siempre de forma manual.

Mi sugerencia es similar a @erikstokes con org-table-import, pero dentro del bloque de origen # + BEGIN_SRC emacs-lisp. Es una forma muy eficiente de tratar con Cc Cv Cb (org-babel-execute-buffer).

También puede incluir nombres de columna en CSV.

Por ejemplo, aquí está `tmp.csv 'en el mismo directorio.

v1 id,v2 size,v3 width,v4,v5
1,2,3,4,5
2,2,3,4,5
3,2,3,4,5
4,2,3,4,5

Aquí está el código fuente del modo Org Emacs-Lisp.

#+BEGIN_SRC emacs-lisp :results value :exports both
(with-temp-buffer
 (org-table-import "tmp.csv" nil) ;; MEMO on `nil' arg is in the footnotes.
 (setq LST (org-table-to-lisp))
 ;; comment out or cut below one line if you don't have column names in CSV file.
 (append (list (car LST)) '(hline) (cdr (org-table-to-lisp)))
 )
#+END_SRC

#+NAME: TABLENAME-HERE-FOR-FURTHER-REUSE
#+RESULTS:
| v1 id | v2 size | v3 width | v4 | v5 |
|-------+---------+----------+----+----|
|     1 |       2 |        3 |  4 |  5 |
|     2 |       2 |        3 |  4 |  5 |
|     3 |       2 |        3 |  4 |  5 |
|     4 |       2 |        3 |  4 |  5 |

Hay un buen contenido simple para importar CSV con Babel en modo Org: titulado "Lectura y escritura de archivos"

http://orgmode.org/cgit.cgi/org-mode.git/plain/doc/library-of-babel.org

Notas al pie sobre nil arg de `org-table.el ':

  • SEPARATOR especifica el separador de campo en las líneas. Puede tener los siguientes valores:
  • '(4) Use la coma como separador de campo
  • '(16) Use una TAB como separador de campo
  • entero Cuando un número, usa tantos espacios como separador de campo
  • nil Cuando nil, el comando intenta ser inteligente y descubrir el separador de la siguiente manera:
    • cuando cada línea contiene una TAB, suponga material separado por TAB
    • cuando cada línea contiene una coma, suponga material CSV
    • de lo contrario, asuma uno o más caracteres de ESPACIO como separador.

Agradezco los comentarios de @Sean Allred, por la simplificación y la eficiencia del proceso.


¿Cómo es esto efectivamente diferente de la respuesta aceptada ?
Sean Allred

@Sean Allred, gracias por tu comentario. Tienes razón, mi sugerencia anterior era complicada.
RUserPassingPor

Muy agradable (y no R! :)).
deshace el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.