我一直在学习SICP,我想应用到目前为止学到的一些概念。即累积,映射和过滤将帮助我提高工作效率。我主要使用CSV文件,并且我知道MIT / GNU方案不支持此文件格式。但这没关系,因为支持txt文件,因此我可以将CSV文件导出为txt文件。
现在,我阅读了本手册的第14节“输入/输出”,坦率地说,缺少具体示例并不能帮助我入门。因此,我希望你们中的一些人能给我一个开端。我有一个文本文件foo.txt,其中包含变量和国家列表的观察值。我只想将此文件读入Scheme并处理数据。谢谢您的帮助。任何示例代码都会有所帮助。
答案 0 :(得分:2)
方案提供了几种读取文件的方法。您可以使用“打开/关闭”样式,如下所示:
(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))))
最后,我最喜欢的是,将current-input-port更改为从文件中读取,运行提供的过程,关闭文件并最后重置current-input-port:
(with-input-from-file "file.txt"
(lambda ()
(display (read))))
您还需要阅读Input Procedures上的部分。上面使用的“读取”功能仅从端口读取下一个Scheme对象。还有read-char,read-line等。如果您已经从文件中读取了所有内容,您会得到一些东西吗?会在返回true时返回-如果在文件中循环读取所有内容,则很有用。
例如将文件中的所有行读入列表
(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
答案 1 :(得分:0)
(call-with-input-file "my_file.txt"
(lambda (port)
(read port))) ; reads the file's contents
请参阅有关file ports和一般ports的参考手册。