EmacsのSESでCSVファイルを読み書きする
標準ではタブ区切りテキストしか対応していないので、rubyを通してCSVと変換できるようにしてみた。
;; ses-csv.el -- Read/Write CSV file for SES ;; Author: Takashi Hattori (hattori@sfc.keio.ac.jp) ;; Requires: Ruby (defun ses-read-from-csv-file (file) "Insert the contents of a CSV file named FILE into the current position." (interactive "fCSV file: ") (let ((buf (get-buffer-create "*ses-csv*")) text) (save-excursion (set-buffer buf) (erase-buffer) (process-file "ruby" file buf nil "-e" "require 'csv'; CSV::Reader.parse(STDIN) { |x| puts x.join(\"\\t\") }") (setq text (buffer-substring (point-min) (point-max)))) (ses-yank-tsf text nil))) (defun ses-write-to-csv-file (file) "Write the values of the current buffer into a CSV file named FILE." (interactive "FCSV file: ") (push-mark (point-min) t t) (goto-char (- (point-max) 1)) (ses-set-curcell) (ses-write-to-csv-file-region file)) (defun ses-write-to-csv-file-region (file) "Write the values of the region into a CSV file named FILE." (interactive "FCSV file: ") (ses-export-tab nil) (let ((buf (get-buffer-create "*ses-csv*"))) (save-excursion (set-buffer buf) (erase-buffer) (yank) (call-process-region (point-min) (point-max) "ruby" t buf nil "-e" "require 'csv'; w = CSV::Writer.create(STDOUT); STDIN.each { |x| w << x.chomp.split(/\\t/) }") (write-region (point-min) (point-max) file))))