¿Es posible convertir convertir un xls
archivo en una org
tabla? Encontré este artículo en el wiki de emacs pero no pude hacerlo funcionar.
¿Es posible convertir convertir un xls
archivo en una org
tabla? Encontré este artículo en el wiki de emacs pero no pude hacerlo funcionar.
Respuestas:
Guarde el archivo como un archivo delimitado por tabulaciones (usando Excel o el localc
comando mencionado en la respuesta de @ YoungFrog). Luego, ejecute org-table-import
en el punto donde desea insertar la tabla.
org-table-import
está bien para archivos csv simples, pero se romperá si una celda contiene una nueva línea (que es el caso para mí).
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-install
RETESS
). 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 R
o yum install R
etc. 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/
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
.
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 ':
Agradezco los comentarios de @Sean Allred, por la simplificación y la eficiencia del proceso.