我有这个文本:
(FIEC01552 LENGUAJES DE PROGRAMACION 40)
(FIEC06411 COMPUTACION Y SOCIEDAD 39)
(FIEC03459 INTELIGENCIA ARTIFICIAL 40)
(ICM01974 ECUACIONES 40)
(ICM00604 ALGEBRA 40)
所以我想编辑或删除其中一个,这样我的文件 txt 看起来像
(FIEC01552 CALCULO INTEGRAL 30)
(FIEC06411 COMPUTACION Y SOCIEDAD 39)
(ICM01974 ECUACIONES 40)
(ICM00604 ALGEBRA 40)
在这一刻刚刚用这段代码读取了一个文件
(let ((in (open "/tmp/materias.txt" :if-does-not-exist nil)))
(when in
(loop for line = (read-line in nil)
while line do (format t "~a~%" line))
(close in)
)
)
目前我正在为这个项目使用窗口中的剪辑
最佳答案
首先,您不想自己使用打开和关闭功能。有 with-open-file这将允许我们打开文件,并在我们完成后自动关闭它。那么既然我们可以打开文件,我们如何从中提取数据呢?好吧,数据存储为列表,所以我们可以使用函数 read它读取 Lisp 数据结构(在本例中为列表)。所以现在让我们编写一个函数来读取文件中的所有数据。
(defun read-input (file)
"Return a list containing all of the data that is in the file."
(with-open-file (in file :direction :input)
(loop for exp = (read in nil nil) ; Read an expression, if the file is empty
while exp ; exp will be nil, so the while will fail.
collect exp))) ; Collect the data into a list.
现在我们可以读入所有数据,我们必须删除不需要的数据。假设我们有一个谓词“不需要”,它对我们要删除的任何数据都返回 true。然后我们可以使用函数 remove-if这将采用谓词和列表,并将删除列表中满足谓词的所有元素。所以现在让我们编写一个函数来完成它。
(defun eliminate-unwanted-data (data-list)
"Remove all of the unwanted data from DATA-LIST."
(remove-if #'unwanted data-list))
如果您想编辑数据,您将不得不使用函数“edit-data”,它使用类似 mapcar 的东西,它将一个函数应用于列表的每个元素。然后,您所要做的就是编写一个单独的函数“convert-data”,它将获取一段数据并将其转换为您想要的任何新数据。
所以我们现在可以读入数据,并删除所有不需要的数据。剩下的就是将其写回文件。我们可以再次使用 with-open-file,因为它允许我们打开输入和输出文件。
(defun write-output (data-list file)
"Write the data out to the file."
(with-open-file (out file :direction :output
;; We want to replace the file if it already exists.
:if-exists :supersede)
(loop for data in data-list ; For each piece of data,
do (print data out)))) ; print it to the file.
现在我们有了可以完成我们想要的所有部分的函数,剩下的就是将它们链接在一起。
(defun run (in-file out-file)
"Do the whole thing."
(write-output (eliminate-unwanted-data (read-input in-file))
out-file))
我们完成了!剩下的就是用我们要使用的文件调用运行(它们也可以是同一个文件)。
(run "input-file" "output-file")
关于lisp - 如何在 lisp 中读取和编辑 file.txt 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27891288/