чтение файла в common lisp
Как прочитать следующий файл, который имеет столбцы данных с разделителями заголовка и пространства или табуляции, в common lisp.
Я также хотел поместить данные в список списка, который содержит строки.
также, Как получить разницу в датах в common lisp
ID YR MO DA YrM мама дам
100 2010 2 20 2010 8 30
110 2010 4 30 2010 9 12
112 2010 8 20 2010 10 20
3 ответов
вы можете прочитать полную строку из потока с READ-LINE. Вы используете WITH-OPEN-FILE для подключения потока к файлу, учитывая, что у вас есть имя файла. Чтобы получить каждую строку в качестве элемента списка, используйте LOOP:
(loop for line = (read-line stream nil 'eof) until (eq line 'eof) collect line)
для разделения каждой строки на столбцы требуется некоторое усилие в базовом общем Lisp, но есть это СL-коммунальные услуги пакет, содержащий функцию SPLIT-SEQUENCE, которая может разделить строку с разделителями в список токенов.
первый поиск для обработки даты дал http://common-lisp.net/project/cl-date-calc/index.html, который имеет функцию Дельта-дней.
функция для чтения таблицы с столбцами NUMCOLS из потока
предполагается, что элементы из таблицы можно читать с помощью READ
. (PEEK-CHAR T ...)
проверяет, есть ли еще какой-то текст без пробелов в потоке.
(defun read-a-table (stream numcols)
(cons (loop repeat numcols collect (read stream))
(loop while (peek-char t stream nil nil)
collect (loop repeat numcols collect (read stream)))))
вот два примера функций
Один читает таблицу из файла, другой читает таблицу из строки.
(defun read-a-table-from-file (file numcols)
(with-open-file (stream file)
(read-a-table stream numcols)))
(defun read-a-table-from-string (string numcols)
(with-input-from-string (stream string)
(read-a-table stream numcols)))
давайте протестируем его с помощью строка:
(defun test ()
(read-a-table-from-string "ID YR MO DA YrM MoM DaM
100 2010 2 20 2010 8 30
110 2010 4 30 2010 9 12
112 2010 8 20 2010 10 20"
7))
выполнение теста
CL-USER 15 > (test)
((ID YR MO DA YRM MOM DAM)
(100 2010 2 20 2010 8 30)
(110 2010 4 30 2010 9 12)
(112 2010 8 20 2010 10 20))
используйте cl-ppcre. Функция "split" идеально подходит для этого, и я использую ее в своих программах. Просто установите его для использования #\Space в качестве разделителя.