elisp:将文件读入列表列表

elisp: read file into list of lists

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

a b
c d

需要成为

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

目前我只知道如何将内容读取到由换行符确定的简单列表中。每当我需要使用该列表中的一个元素时,我每次都必须用空格将其拆分,但最好只预先完成一次。

像这样:

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

虽然 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 的使用避免干扰可能正在访问同一文件的任何其他缓冲区。

使用 dash, s and f 个第三方库:

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

或:

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

这是一回事。