我有以下文件data.txt
A
B
C
D
我想将此文件的内容读入Lisp list
,如
(defun read-list-from-file (fn)
(interactive)
(list "A" "B" "C" "D"))
(defun my-read ()
(interactive)
(let (( mylist (read-list-from-file "data.txt")))
(print mylist t)))
如何修改read-list-from-file
以使其返回相同的列表,而是从作为输入参数fn
给出的文件中读取。文件中的每一行应该是列表中的单独项目..
答案 0 :(得分:9)
此代码:
(with-current-buffer
(find-file-noselect "~/data.txt")
(split-string
(save-restriction
(widen)
(buffer-substring-no-properties
(point-min)
(point-max)))
"\n" t))
以下是insert-file-contents
的版本:
(defun slurp (f)
(with-temp-buffer
(insert-file-contents f)
(buffer-substring-no-properties
(point-min)
(point-max))))
(split-string
(slurp "~/data.txt") "\n" t)
答案 1 :(得分:6)
比创建临时缓冲区要容易得多的是使用f
文件操作库的f-read
函数来返回文件的文本内容(默认编码为UTF-8)。
f
是您需要从MELPA安装的第三方,阅读有关如何使用Emacs包管理系统的Xah Lee's教程。然后你可以使用split-string
或s
字符串操作库&{39} {s-split
(这是前一个函数的简单包装):
(s-split "\n" (f-read "~/data.txt") t) ; ("A" "B" "C" "D")
注意:设置为s-split
的{{1}}的第三个参数省略了空字符串。您可以使用s-lines
,但由于* nix系统上的文本文件通常包含尾随换行符,因此返回的列表将为t
。您可以使用dash
列表操作库的butlast
函数删除最后一个元素,但这适用于O(n),因此可能会坚持("A" "B" "C" "D" "")
,除非您想要空行保留在列表中。