Основной способ сделать это - использовать with-open-file
для получения входного потока, read-line
в loop
для получения строк, split-sequence
(из библиотеки с тем же именем), чтобы разбить его на поля и parse-number
(из одноименной библиотеки) для преобразования строк в числа. Все упомянутые библиотеки доступны с Quicklisp .
РЕДАКТИРОВАТЬ: просто, чтобы начать, это простая версия без проверки:
(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))))
Вам следует добавить несколько проверок и подумать о том, что вы хотите получить в случае, если они не выполнены:
- Все ли строки одинаковой длины?
- Являются ли все поля действительными числами?