чтение файла в 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 в качестве разделителя.