Convertendo um arquivo xls para o modo organizacional?


8

É possível converter um xlsarquivo em uma orgtabela? Encontrei este artigo no wiki do emacs, mas não consegui fazê-lo funcionar.



@lawlist Como mencionei na pergunta, conheço o UnXls, mas não consegui fazê-lo funcionar.
Brian Fitzpatrick

Eu acho que é isso - ou seja, o tópico que vinculei e o wiki do Emacs. Não acredito que exista mais alguma coisa. Provavelmente eu salvaria a planilha como algo como um arquivo de texto delimitado por tabulações usando o Microsoft Excel e, então, faria o que quisesse com o pós-dados dos dados.
lawlist

Respostas:


6

Salve o arquivo como um arquivo delimitado por tabulação (usando o Excel ou o localccomando mencionado na resposta do @ YoungFrog). Em seguida, execute org-table-importno ponto em que deseja inserir a tabela.


Troquei isso para a resposta aceita. Todas as respostas funcionam, mas esta é a mais rápida. Obrigado!
Brian Fitzpatrick

org-table-importestá ok para arquivos csv simples, mas será interrompido se uma célula contiver uma nova linha (que é o meu caso).
YoungFrog

6

Como você está usando o Excel, você também pode estar interessado em outras ferramentas para trabalhar com dados estatísticos. Veja como você pode usar a linguagem de programação R para importar um arquivo XSL para o modo Emacs Org:

* 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 é o exemplo de arquivo XLS que usei http://berkeleycollege.edu/browser_check/samples/excel.xls

Você precisará instalar o pacote ESS para interagir com o R do Emacs, bem como com a própria linguagem R. Veja aqui: http://ess.r-project.org/Manual/ess.html#Installation para obter instruções (ou apenas faça M-xpackage-installRETESS). Você precisará ativar o R ​​nos blocos de código da Org Babel adicionando isso ao seu arquivo de inicialização do Emacs:

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

Para instalar o R, consulte aqui: http://cran.r-project.org/doc/manuals/r-release/R-admin.html#Installation , mas essas instruções são para aqueles que desejam criar o idioma em próprios. Você normalmente pode instalá-lo no Linux usando seu gerenciador de pacotes, por exemplo. apt-get install Rou yum install Retc. Também existem binários para outras plataformas, por exemplo: Os binários do MS Windows podem ser encontrados aqui: http://cran.r-project.org/bin/windows/base/


4

Aqui está o que eu faço. Não é o ideal, mas meio que funciona. Primeiro, eu uso o LibreOffice Calc para converter para CSV:

localc --convert-to csv --headless filename

Então eu uso pcsv.el (um analisador de CSV) para converter de CSV para Lisp e insiro o resultado como uma tabela no 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))

É um pouco demorado devido a como eu fatorei as funções. O que precisamos aqui é yf/insert-csv-as-table.


1

Suponho que você precise converter seu XLS para CSV primeiro.

Quero evitar a importação de vários CSVs para o modo Org, sempre que manualmente.

Minha sugestão é semelhante a @erikstokes com org-table-import, mas dentro do # + BEGIN_SRC emacs-lisp source block. É uma maneira muito eficiente de lidar com Cc Cv Cb (org-babel-execute-buffer).

Você também pode incluir nomes de colunas no CSV.

Por exemplo, aqui está `tmp.csv 'no mesmo diretório.

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

Aqui está o código-fonte do Emacs-Lisp no modo Org.

#+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 |

Há um conteúdo simples e bom sobre a importação de CSV com o modo de organização Babel: intitulado "Lendo e gravando arquivos"

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

Notas de rodapé sobre zero arg de `org-table.el ':

  • SEPARATOR especifica o separador de campos nas linhas. Pode ter os seguintes valores:
  • '(4) Use a vírgula como separador de campos
  • '(16) Use um TAB como separador de campos
  • inteiro Quando um número, use tantos espaços como separador de campos
  • nil Quando nulo, o comando tenta ser inteligente e descobrir o separador da seguinte maneira:
    • quando cada linha contém um TAB, assuma o material separado por TAB
    • quando cada linha contém uma vírgula, assuma o material CSV
    • caso contrário, assuma um ou mais caracteres ESPAÇO como separador.

Agradeço os comentários de @Sean Allred, pela simplificação e eficiência do processo.


Como isso é efetivamente diferente da resposta aceita ?
Sean Allred

@ Sean Allred Agradeço o seu comentário. Você está certo, minha sugestão anterior foi complicada.
RUserPassingBy

Muito bom (e não R! :)).
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.