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
的使用避免干扰可能正在访问同一文件的任何其他缓冲区。
(--map (s-split " " it) (s-lines (s-chomp (f-read "FILE.TXT"))))
或:
(->> "FILE.TXT" f-read s-chomp s-lines (--map (s-split " " it)))
这是一回事。
我需要将文件内容读入二维列表,用换行符和空格分隔。例如,
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
的使用避免干扰可能正在访问同一文件的任何其他缓冲区。
(--map (s-split " " it) (s-lines (s-chomp (f-read "FILE.TXT"))))
或:
(->> "FILE.TXT" f-read s-chomp s-lines (--map (s-split " " it)))
这是一回事。