我有这个文件:

(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中使用clips来完成这个项目

最佳答案

首先,你不想用函数自己打开和关闭有一个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.

既然我们可以读入所有的数据,我们就必须消除我们不想要的数据假设我们有一个谓词‘unnegated’,它在我们要删除的任何数据块上返回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”,它将获取一条数据并将其转换为您想要的任何新数据。
所以我们现在可以读取数据,并删除所有不需要的数据剩下的就是把它写回一个文件我们可以再次使用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")

关于lisp - 如何在Lisp中读取和编辑file.txt的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27891288/

10-16 16:08