问题描述
2htdp/batch-io库包含有用的read-csv-file
过程,用于将CSV文件读入列表。它以文件名作为参数。不幸的是,它不使用包含CSV作为其参数的字符串。假设我在字符串变量中有一个CSV,并且我想使用read-csv-file
来解析它。有没有一种方法可以避免仅将CSV解析为文件而保存到文件中?
文档说:
可能可以利用标准输入功能来实现此目的,但我不知道如何继续执行此想法。
解决方法
2htdp库适合初学者使用,因此不如其他csv库灵活。因此,您有两个选择:
-
batch-io
提供的simulate-file
与您想要的东西类似,但是没有比将字符串包装到将其包装到类似对象的文件的函数中更干净的东西了:
> (simulate-file read-csv-file "test,test,test")
(list (list "test" "test" "test"))
- 使用
csv-reading
(必须下载csv-reading
,(require csv-reading)
,然后继续处理它给您的错误):
#lang racket
(require csv-reading)
> (csv->list "test,test")
(list (list "test" "test" "test"))
如果batch-io
较为笼统,则可以使用string?
或input-port?
,但不是。
我找到了一种使read-csv-file
从字符串中读取的方法:
> (require 2htdp/batch-io)
> (define csv-string "one,one,one\ntwo,two,two")
> (parameterize ([current-input-port (open-input-string csv-string)])
(read-csv-file 'stdin))
'(("one" "one" "one") ("two" "two" "two"))
这通过将标准输入更改为CSV字符串来起作用。
@Ryan Schaefer对simulate-file
的回答很好,但是我对使用仍在“开发中”且没有正确记录的功能感到不舒服。正如simulate-file
的文档所述:
注意:此表格正在开发中,待定稿后将以精确的方式记录下来,对广大读者有用。