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

时间:2015-01-11 19:41:54

标签: lisp common-lisp clisp

我有这个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中使用此项目的剪辑

2 个答案:

答案 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)。将该列表完全写入文件中。