Arrays 在Common Lisp中从文本文件读取数组

Arrays 在Common Lisp中从文本文件读取数组,arrays,file,lisp,common-lisp,Arrays,File,Lisp,Common Lisp,我试图从文本文件中读取Lisp中的数据(实际上是一个数组)。 我试着用打开文件和读取行的东西,但没能达到我的目标。我所寻找的相当于在MATLAB中执行data=load('filename.txt'),这样我就得到了一个名为data的数组,它已将所有信息加载到filename.txt中 文本文件的格式如下 1.0 2.0 3.0 ... 1.5 2.5 3.5 ... 2.0 3.0 4.0 ... ..... 尺寸也可能有所不同。非常感谢。假设您的文件遵循您在问题中给出的格式模式:用空格分

我试图从文本文件中读取Lisp中的数据(实际上是一个数组)。 我试着用
打开文件
读取行
的东西,但没能达到我的目标。我所寻找的相当于在MATLAB中执行
data=load('filename.txt')
,这样我就得到了一个名为
data
的数组,它已将所有信息加载到
filename.txt

文本文件的格式如下

1.0 2.0 3.0 ...
1.5 2.5 3.5 ...
2.0 3.0 4.0 ...
 .....

尺寸也可能有所不同。非常感谢。

假设您的文件遵循您在问题中给出的格式模式:用空格分隔的数字序列,这是一个快速片段,可以满足您的需要

(defun read-array (filename)
  (with-open-file (in filename)
    (loop for num = (read in nil)
          until (null num)
          collect num)))

另一种方法是利用lisp阅读器解析文本文件中的数据。为此,我可能首先将整个文件转换为字符串,然后调用

(eval (read-from-string (format nil "~a~a~a" "(initial wrapper code " str ")")))
例如,如果要在列表中读取所有数字(以空格/换行符分隔)的数据文件,则前面的命令如下所示:

(eval (read-from-string (format nil "~a~a~a" "(list " str ")")))

基本方法是使用
打开文件
获取输入流,
读取
循环中的行
获取行,
拆分序列
(来自同名库)将其拆分为字段,以及
解析编号
(来自同名库)将字符串转换为数字。所有提及的图书馆均可从以下网址获得:

编辑:为了让您开始,这是一个没有验证的简单版本:

(defun load-array-from-file (filename)
  (with-open-file (in filename
                      :direction :input)
    (let* ((data-lol (loop :for line := (read-line in nil)
                           :while line
                           :collect (mapcar #'parse-number:parse-number
                                            (cl-ppcre:split "\\s+" line))))
           (rows (length data-lol))
           (columns (length (first data-lol))))
      (make-array (list rows columns)
                  :initial-contents data-lol))))
您应该添加一些检查,并考虑如果未满足这些检查,您希望得到什么:

  • 这些行的长度都一样吗
  • 所有字段是否都是有效数字

    • 我听从了斯万特的建议。我只需要文本文件中的一列,这就是我为此目的使用的

      (defun load_data (arr column filename)
      (setf lnt (first (array-dimensions arr)))
       (with-open-file (str (format nil "~A.txt" filename) :direction :input)
         (loop :for i :from 0 :to (1- lnt) :do
             (setf (aref arr i 0) (read-from-string (nth (1- column) (split-sequence:SPLIT-SEQUENCE #\Space (read-line str))))))))
      

      谢谢大家的帮助。

      使用读卡器解析用户输入通常不是一个好主意。@Svante:如果运行程序的同一用户也提供数据,那么问题出在哪里?@Rörd:程序/系统只能安全地区分其内部和外部。它不应该猜测外部发生的事情。@Svante:好的,但这条规则并不能确定系统的边界。如果所有的输入数据都将由一个拥有运行任意代码所需权限的用户生成,那么我仍然不认为“快速而肮脏”的解决方案有什么问题。