2009-08-06 8 views
37

Emacs có phần mở rộng rất đẹp bằng tên của chế độ org.Emacs: nhập CSV vào chế độ org

Tôi muốn có thể dễ dàng tải các tệp CSV vào chế độ tổ chức mà không gây đau buồn đáng kể. Tất cả những gì tôi có thể tìm thấy là nhập bảng hoặc chụp bảng, mà chỉ cần đặt, không hoạt động tốt.

Lưu ý rằng một phần vấn đề của tôi là chuỗi văn bản có dấu phẩy bên trong chúng. 1,2,3,4 khác với 1,2, "3,4".

Có một chức năng ngoài đó hoặc tập lệnh perl mà người ta có thể chạy để chuyển đổi tệp csv thành định dạng chế độ org không?

Cảm ơn!

+0

Hãy xem liệu http://code.google.com/p/csvfix/ bởi Neil Butterworth. Nó có chuyển đổi CSV-> XML, vì vậy có lẽ bạn có thể sử dụng nó như là một phần của giải pháp. –

+0

Chỉ đọc một phần có liên quan nhưng vẫn đáng giá đối với những ai chưa biết về số lượng các trường hợp cạnh của CSV: https://tburette.github.io/blog/2014/05/25/so-you-want- to-write-your-own-CSV-code/ – sampablokuper

Trả lời

5

Tôi giả sử bạn muốn chuyển đổi CSV của mình thành chế độ org bảng. Nếu đó không phải là trường hợp, bạn có thể muốn rõ ràng hơn về định dạng đầu ra trong câu hỏi của bạn.

Something như thế này nên làm điều đó, hoặc ít nhất giúp bạn có được một điểm khởi đầu bạn có thể hack vào lúc:

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

Từ hướng dẫn org-mode:

C-c | Chuyển vùng hoạt động sang bảng. Nếu mỗi dòng chứa ít nhất một ký tự TAB, hàm giả định rằng tài liệu là tab cách nhau . Nếu mỗi dòng chứa một dấu phẩy , các giá trị được phân cách bằng dấu phẩy (CSV) được giả định. Nếu không, các dòng được phân tách tại khoảng trắng vào các trường. Bạn có thể sử dụng một đối số tiền tố để buộc một cụ separator: lực lượng C-u CSV, C-u C-u lực lượng TAB, và một cuộc tranh luận số N chỉ ra rằng ít nhất N liên tiếp không gian, hoặc cách khác một TAB sẽ tách. Nếu không có vùng hoạt động , lệnh này sẽ tạo một bảng rỗng .

Vì vậy, chỉ cần dán dữ liệu vào tệp tổ chức, chọn dữ liệu đó và thực hiện C-u C-c |.

+0

Hmm, có vẻ như chữ "fi" trong PDF đã bị xóa khỏi trích dẫn ở trên ... dù sao ... "các trường" phải là "trường", "specic "phải là" cụ thể "và" tiền tố "phải là" tiền tố ". –

+1

Không hoạt động khi bạn có các trường CSV chứa dấu phẩy, mà OP chỉ định ... – genehack

+0

C-u C-c | làm việc cho tôi với các tập tin dấu phẩy. – tenpn

1

Hãy thử điều này:

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

Đây là một chút của một hack-công việc, nhưng nó hoạt động.

khi bạn xuất tệp CSV, buộc báo giá xung quanh mỗi mục nhập, sau đó thay thế tất cả "," làm thanh dọc.

Cuối cùng, tôi thực hiện một macro mà làm điều gì đó như thế này:

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

(Tôi không chắc chắn 100% nếu | là một self-insert-char hay không, vì vậy hết sức mình để ghi vĩ mô của riêng bạn)

Tab truy cập ở đâu đó ở giữa bảng và chế độ org định dạng đúng cách. Tôi thấy việc này dễ dàng hơn trong một khu vực bị thu hẹp.

Lưu ý: Nếu bạn có thanh dọc trong đầu vào của mình .. có thể nó sẽ không hoạt động hoàn toàn đúng.Các tình huống như vậy sẽ dễ dàng phát hiện và dễ sửa chữa.

Nói chung, khi nhập khẩu một cái gì đó giống như văn bản vào org-mode, tôi đã tìm thấy một sự kết hợp của một số văn bản vĩ mô thông minh, và tìm kiếm thay thế là cách dễ nhất

Tôi hy vọng rằng sẽ giúp.

2

Có một cái nhìn tại địa chỉ:

C-h f org-table-convert-region

Tôi luôn chuyển đổi csv vì vậy tôi thêm này để emacs của tôi.

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

cập nhật

Dưới đây là một chức năng mà xem xét dấu phẩy trích dẫn cũng như:

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

cảm thấy tự do để cải thiện nó :-).

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