2009-08-06 3 views
37

Emacs hat eine sehr schöne Erweiterung mit dem Namen org-mode.Emacs: Importieren einer CSV in den Org-Modus

Ich möchte in der Lage sein, CSV-Dateien leicht in Org-Modus ohne erhebliche Trauer laden. Alles, was ich finden konnte, ist Tabellen-Import oder Tabellen-Capture, die, einfach ausgedrückt, nicht annähernd funktionieren.

Beachten Sie, dass Teil meines Problems Textzeichenfolgen mit einem Komma in ihnen sind. 1,2,3,4 ist anders als 1,2, "3,4".

Gibt es eine Funktion oder ein Perl-Skript, das man ausführen könnte, um eine CSV-Datei in ein Org-Mode-Format umzuwandeln?

Danke!

+0

Werfen Sie einen Blick, wenn http://code.google.com/p/csvfix/ von Neil Butterworth. Es hat CSV-> XML-Konvertierung, vielleicht könnten Sie das als Teil der Lösung verwenden. –

+0

Nur teilweise verwandt, aber dennoch lohnenswert für jeden, der sich der Anzahl der Randfälle, die CSV präsentiert, nicht bewusst ist: https://tburette.github.io/blog/2014/05/25/so-you-want- to-write-your-own-CSV-Code/ – sampablokuper

Antwort

5

Ich nehme an, Sie möchten Ihre CSV speziell in den Org-Modus Tabellen konvertieren. Wenn dies nicht der Fall ist, sollten Sie das Ausgabeformat in Ihrer Frage genauer angeben.

So etwas sollte es tun, oder zumindest Ihnen einen Ausgangspunkt erhält Sie hacken können:

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

Aus dem org-Modus Handbuch:

C-c | Konvertieren Sie die aktive Region in Tabelle. Wenn jede Zeile mindestens ein TAB-Zeichen enthält, geht die Funktion davon aus, dass das Material Tab getrennt ist. Wenn jede Zeile ein Komma enthält, werden durch Komma getrennte Werte (CSV) angenommen. Ist dies nicht der Fall, werden die Zeilen in Leerfelder aufgeteilt. Sie können einen Präfix Argument einen spezifischen Separator zu erzwingen: C-U Kräfte CSV, C-u C-U Kräfte TAB und ein numerisches Argument N dass Räume mindestens N aufeinanderfolgenden anzeigt, oder alternativ eine TAB seine der Separator. Wenn es keine aktive Region gibt, erstellt dieser Befehl eine leere Org-Tabelle.

Fügen Sie die Daten einfach in eine Organisationsdatei ein, wählen Sie sie aus und machen Sie C-u C-c |.

+0

Hmm, sieht so aus, als ob die "fi" Ligaturen im PDF aus dem obigen Zitat gestrichen wurden ... wie auch immer ... "elds" sollte "fields" sein, "specic "sollte" spezifisch sein "und" prex "sollte" Präfix "sein. –

+1

Funktioniert nicht, wenn Sie CSV-Felder haben, die Kommas enthalten, die das OP angibt ... – genehack

+0

C-u C-c | arbeitete mit Komma-Dateien für mich. – tenpn

1

Versuchen Sie folgendes:

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

hier ein bisschen wie ein Hack-Job ist, aber es funktioniert.

Wenn Sie die CSV-Datei exportieren, erzwingen Sie Anführungszeichen um jeden Eintrag, und ersetzen Sie dann alle "," als vertikalen Balken.

Schließlich mache ich einen Makro, das so etwas wie dies funktioniert:

C-a ; Beginning-of-line 
|  ; Self-insert-char 
C-e ; end-of-line 
|  ; Self-insert-char 
<down> ; Down one line 

(Ich bin nicht 100% sicher, ob | ist ein selbst insert-Zeichen oder nicht, so dass ihre am besten Ihr eigenes Makro aufzeichnen)

Hit Tab irgendwo in der Mitte der Tabelle und Org-Modus formatiert es richtig. Ich finde das in einer eingeengten Region einfacher.

Vorbehalt: Wenn Sie einen vertikalen Balken in Ihrer Eingabe haben .. wird es wahrscheinlich nicht ganz richtig funktionieren.Situationen wie diese sollten leicht zu erkennen und relativ einfach zu beheben sein.

Im Allgemeinen, wenn etwas text wie in org-Modus importieren, ich habe eine Kombination aus einigen Smart-Makro Schreiben gefunden, und Such ersetzen die einfachste Art und Weise

ich das hilft Hoffnung sein.

2

Werfen Sie einen Blick auf:

C-h f org-table-convert-region

ich immer csv konvertieren bin, damit ich das meinem .emacs hinzu.

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

Update

Hier ist eine weitere Funktion, die die genannten Kommas als auch der Auffassung:

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

fühlen Sie sich frei, es zu verbessern :-).

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