Как мне прочитать текстовый файл на схеме MIT / GNU?

Я прошел через SICP и хотел бы применить некоторые концепции, которые я изучил до сих пор. А именно накопление, отображение и фильтрация помогут мне работать более продуктивно. Я работаю в основном с файлами CSV и знаю, что схема MIT / GNU не поддерживает этот формат файла. Но это нормально, поскольку я могу экспортировать файл CSV в файл txt, поскольку файлы txt поддерживаются.

Теперь я прочитал Раздел 14 «Ввод / вывод» руководства, и, откровенно говоря, отсутствие конкретных примеров не помогает мне начать работу. Поэтому я надеюсь, что некоторые из вас дадут мне фору. У меня есть текстовый файл foo.txt, состоящий из переменных и наблюдений для списка стран. Я просто хочу прочитать этот файл в схеме и манипулировать данными. Спасибо за помощь. Любой пример кода был бы полезен.


person Mohamed Nabassoua    schedule 15.04.2019    source источник


Ответы (2)


(call-with-input-file "my_file.txt"
  (lambda (port)
    (read port))) ; reads the file's contents

См. Справочное руководство по файловые порты и на порты в общем.

person igneus    schedule 15.04.2019
comment
Спасибо, игнеус. Я прочту этот раздел еще раз, когда вы привели простой пример. В первый раз, когда я прочитал его, из-за отсутствия конкретных примеров мне было сложно понять. - person Mohamed Nabassoua; 16.04.2019

Схема предоставляет несколько способов чтения из файлов. Вы можете использовать стиль «открыть / закрыть» следующим образом:

(let ((port (open-input-file "file.txt")))
  (display (read port))
  (close-input-port port))

Вы также можете использовать ответ igneus, который передает порт процедуре и автоматически закрывает порт для вас, когда процедура завершается:

(call-with-input-file "file.txt"
  (lambda (port)
    (display (read port))))

Наконец, мой любимый, изменяет текущий порт ввода на чтение из файла, запускает предоставленную процедуру, закрывает файл и сбрасывает текущий порт ввода в конце:

(with-input-from-file "file.txt"
                      (lambda ()
                        (display (read))))

Вы также можете прочитать раздел Процедуры ввода. Используемая выше функция «чтения» только считывает следующий объект схемы из порта. Есть также read-char, read-line и т. Д. Если вы прочитали все из файла, вы получите что-то, что eof-object? вернет true on - полезно, если вы просматриваете файл, чтобы прочитать все его содержимое.

например чтение всех строк файла в список

(with-input-from-file "text.txt"
  (lambda ()
    (let loop ((lines '())
               (next-line (read-line)))
       (if (eof-object? next-line) ; when we hit the end of file
           (reverse lines)         ; return the lines
           (loop (cons next-line lines) ; else loop, keeping this line
                 (read-line))))))       ; and move to next one
person Peter    schedule 15.04.2019
comment
Большое спасибо, Питер. Я слежу за вашими предложениями прямо сейчас, и они отлично работают. Спасибо за вашу помощь. - person Mohamed Nabassoua; 16.04.2019