чтение файла в общем lisp - PullRequest
7 голосов
/ 01 ноября 2010

Как мне прочитать следующий файл, в котором есть столбцы данных с заголовком и пробелом или табуляцией, в общем списке.

Я также хотел поместить данные в список, содержащий строки.

Также, как получить разницу в датах в общих списках

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

Ответы [ 3 ]

10 голосов
/ 01 ноября 2010

Функция для чтения таблицы из столбцов 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))
4 голосов
/ 01 ноября 2010

Вы можете прочитать полную строку из потока с помощью READ-LINE . Вы используете WITH-OPEN-FILE для подключения потока к файлу, если у вас есть имя файла. Чтобы получить каждую строку как элемент списка, используйте LOOP:

(loop
   for line = (read-line stream nil 'eof)
   until (eq line 'eof)
   collect line)

Разделение каждой строки на столбцы требует некоторых усилий в базовом Common Lisp, но есть такой пакет cl-utilities , который содержит функцию SPLIT-SEQUENCE, которая может разбивать разделенный символ строка в списке токенов.

Первый поиск по обработке даты дал http://common -lisp.net / project / cl-date-calc / index.html , который имеет функцию DELTA-DAYS.

1 голос
/ 12 марта 2012

Используйте cl-ppcre. Функция «split» идеально подходит для этого, и я использую ее в своих программах. Просто установите его для использования # \ Space в качестве разделителя.

...