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

标签 lisp common-lisp clisp

我有这个文本:

(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/

相关文章:

lisp - 如何使用 SBCL sb-alien 创建一个 Gtk4 窗口打开它并有一个有效的简单回调?

build - Lisp 可执行文件

lisp - 如何在 LISP 中覆盖 (defun eval (expr)) 函数

lisp - 如何根据 elisp 中的一个条件设置一堆变量?

lisp - 使用相对路径加载文件

clojure - Clojure 被认为是 Lispy 还是 Schemey?

package - 全局声明特殊空间时违反了对包 COMMON-LISP 的锁定

javascript - CL-WHO 始终以单引号开头

格式化列表 : use arguments that aren't in list

lisp - 从另一个文件 clisp 导出函数