Eine XLS-Datei in den Organisationsmodus konvertieren?


8

Ist es möglich, eine xlsDatei in eine orgTabelle zu konvertieren ? Ich habe diesen Artikel im Emacs-Wiki gefunden, konnte ihn aber nicht zum Laufen bringen.



@lawlist Wie ich in der Frage erwähne, sind mir UnXls bekannt, aber ich konnte sie nicht zum Laufen bringen.
Brian Fitzpatrick

Ich denke, das ist es - dh der Thread, den ich verlinkt habe, und das Emacs-Wiki. Ich glaube nicht, dass es noch etwas gibt. Ich würde die Tabelle wahrscheinlich mit Microsoft Excel als tabulatorgetrennte Textdatei speichern und dann mit den Datennachwörtern tun, was ich wollte.
Lawlist

Antworten:


6

Speichern Sie die Datei als localctabulatorgetrennte Datei (mit Excel oder dem in der Antwort von @ YoungFrog genannten Befehl). Führen Sie dann org-table-importden Punkt aus, an dem die Tabelle eingefügt werden soll.


Ich habe dies auf die akzeptierte Antwort umgestellt. Alle Antworten funktionieren, aber dies ist die schnellste. Vielen Dank!
Brian Fitzpatrick

org-table-importist in Ordnung für einfache CSV-Dateien, aber es wird kaputt gehen, wenn eine Zelle einen Zeilenumbruch enthält (was bei mir der Fall ist).
YoungFrog

6

Da Sie Excel verwenden, könnten Sie auch an anderen Tools für die Arbeit mit statistischen Daten interessiert sein. So können Sie eine XSL-Datei mit der Programmiersprache R in den Emacs Org-Modus importieren:

* 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 |

Dies ist die Beispiel-XLS-Datei, die ich unter http://berkeleycollege.edu/browser_check/samples/excel.xls verwendet habe

Sie müssen das ESS-Paket installieren, um mit R von Emacs sowie der R-Sprache selbst zu interagieren. Anweisungen finden Sie hier: http://ess.r-project.org/Manual/ess.html#Installation (oder tun Sie es einfach M-xpackage-installRETESS). Sie müssen R in Org Babel-Codeblöcken aktivieren, indem Sie dies zu Ihrer Emacs-Init-Datei hinzufügen:

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

Um R zu installieren, klicken Sie hier: http://cran.r-project.org/doc/manuals/r-release/R-admin.html#Installation . Diese Anweisungen sind jedoch für diejenigen gedacht, die auf der Sprache aufbauen möchten ihre eigenen. Sie können es normalerweise unter Linux mit Ihrem Paketmanager installieren, z. apt-get install Roder yum install Rusw. Es gibt auch Binärdateien für andere Plattformen, zum Beispiel: MS Windows-Binärdateien finden Sie hier: http://cran.r-project.org/bin/windows/base/


4

Folgendes mache ich Nicht ideal, aber irgendwie funktioniert. Zuerst verwende ich LibreOffice Calc, um in CSV zu konvertieren:

localc --convert-to csv --headless filename

Dann verwende ich pcsv.el (einen CSV-Parser), um von CSV nach Lisp zu konvertieren, und füge dann das Ergebnis als Org-Modustabelle ein:

(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 ist etwas länger, weil ich die Funktionen berücksichtigt habe. Was wir hier brauchen, ist yf/insert-csv-as-table.


1

Ich nehme an, Sie müssen zuerst Ihr XLS in CSV konvertieren.

Ich möchte vermeiden, dass jedes Mal mehrere CSVs manuell in den Org-Modus importiert werden.

Mein Vorschlag ähnelt @erikstokes mit org-table-import, jedoch innerhalb des Emacs-lisp-Quellblocks # + BEGIN_SRC. Es ist eine sehr effiziente Art, mit Cc Cv Cb (org-babel-execute-buffer) umzugehen.

Sie können auch Spaltennamen in CSV aufnehmen.

Hier befindet sich beispielsweise "tmp.csv" im selben Verzeichnis.

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

Hier ist der Emacs-Lisp-Quellcode im Org-Modus.

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

Es gibt einen guten einfachen Inhalt zum Importieren von CSV mit Org-Modus Babel: mit dem Titel "Lesen und Schreiben von Dateien"

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

Footenotes on nil arg aus `org-table.el ':

  • SEPARATOR gibt das Feldtrennzeichen in den Zeilen an. Es kann folgende Werte haben:
  • '(4) Verwenden Sie das Komma als Feldtrennzeichen
  • '(16) Verwenden Sie ein TAB als Feldtrennzeichen
  • Ganzzahl Wenn eine Zahl verwendet wird, verwenden Sie so viele Leerzeichen als Feldtrennzeichen
  • nil Wenn nil, versucht der Befehl, intelligent zu sein und das Trennzeichen auf folgende Weise herauszufinden:
    • Wenn jede Zeile eine TAB enthält, nehmen Sie TAB-getrenntes Material an
    • Wenn jede Zeile ein Komma enthält, nehmen Sie CSV-Material an
    • Andernfalls nehmen Sie ein oder mehrere Leerzeichen als Trennzeichen an.

Ich danke Ihnen für die Kommentare von @Sean Allred, für die Vereinfachung und die Effizienz des Prozesses.


Wie unterscheidet sich dies effektiv von der akzeptierten Antwort ?
Sean Allred

@ Sean Allred Ich danke Ihnen für Ihren Kommentar. Sie haben Recht, mein früherer Vorschlag war kompliziert.
RUserPassingBy

Sehr schön (und kein R! :)).
Undostres
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.