如何在 lisp 中读取和编辑 file.txt 的内容

How can I read and edit the contents of a file.txt in lisp

我有这个 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 中的剪辑

将整个文件作为 s-exprs 列表读取。处理该列表(例如,通过 removing/replacing 一些 s-exprs)。再次将该列表完全写入文件。

首先,你不想自己使用打开和关闭的功能。 with-open-file which will allow us to open the file, and will automatically close it for us when we are done with it. So now that we can open the file, how can we extract the data from it? Well the data is stored as lists, so we can use the function 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',它对我们要删除的任何数据片段 returns 为真。然后我们可以使用函数 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")