我需要将文件内容读入二维列表,按换行符和空格分隔。例如,
a b
c d
需要成为
(list (list "a" "b") (list "c" "d"))
目前我只知道如何将内容读入由换行符确定的简单列表中。每当我需要使用该列表中的元素时,我每次都必须按空格分割,但最好只在事先进行一次。
答案 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)