elisp:将文件读入列表列表

时间:2015-01-20 11:05:43

标签: emacs elisp

我需要将文件内容读入二维列表,按换行符和空格分隔。例如,

a b
c d

需要成为

(list (list "a" "b") (list "c" "d"))

目前我只知道如何将内容读入由换行符确定的简单列表中。每当我需要使用该列表中的元素时,我每次都必须按空格分割,但最好只在事先进行一次。

3 个答案:

答案 0 :(得分:3)

虽然abo-abo的答案很好,但它会创建一个包含文件全部内容的临时字符串,效率很低。如果文件非常大,最好走一个缓冲区来逐行收集数据:

(defun file-to-matrix (filename)
  (with-temp-buffer
    (insert-file-contents filename)
    (let ((list '()))
      (while (not (eobp))
        (let ((beg (point)))
          (move-end-of-line nil)
          (push (split-string (buffer-substring beg (point)) " ") list)
          (forward-char)))
      (nreverse list))))

注意使用with-temp-buffer,避免留下缓冲区,并使用insert-file-contents,这样可以避免干扰可能访问同一文件的任何其他缓冲区。

答案 1 :(得分:2)

像这样:

(with-current-buffer (find-file-noselect "~/foo")
  (mapcar (lambda (x) (split-string x " " t))
          (split-string
           (buffer-substring-no-properties (point-min) (point-max))
           "\n"))) 

答案 2 :(得分:0)

使用dashsf第三方库:

(--map (s-split " " it) (s-lines (s-chomp (f-read "FILE.TXT"))))

或:

(->> "FILE.TXT" f-read s-chomp s-lines (--map (s-split " " it)))

这是一回事。