我有这个txt:
(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)
)
)
此刻我正在Windows中使用此项目的剪辑
答案 0 :(得分:1)
首先,您不想使用自己打开和关闭的功能。 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.
现在我们可以读入所有数据,我们必须消除我们不想要的数据。假设我们有一个谓词' unwanted',它会在我们要删除的任何数据上返回true。然后我们可以使用函数remove-if来获取谓词和列表,并删除列表中满足谓词的所有元素。所以现在让我们编写一个可以执行此操作的函数。
(defun eliminate-unwanted-data (data-list)
"Remove all of the unwanted data from DATA-LIST."
(remove-if #'unwanted data-list))
如果您想编辑数据,则必须使用“编辑数据”功能。使用类似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(它们也可以是同一个文件)。
(run "input-file" "output-file")
答案 1 :(得分:0)
将整个文件作为s-exprs列表读取。列出的过程(例如,通过删除/替换一些s-exprs)。将该列表完全写入文件中。