2

2htdp /batch-io库包含将read-csv-fileCSV 文件读入列表的有用过程。它以文件名作为参数。不幸的是,它没有将包含 CSV 的字符串作为其参数。假设我在一个字符串变量中有一个 CSV,我想用read-csv-file它来解析它。有没有办法避免将 CSV 保存到文件中以便能够解析 CSV?

文档说:

读取标准输入设备(直到关闭)或文件 f 的内容并将其生成为逗号分隔值列表的列表。

可能可以利用标准输入功能来实现这一点,但我不知道如何继续这个想法。

4

2 回答 2

3

2htdp 库是为初学者设计的,因此不如其他 csv 库灵活。因此,您有两种选择:

  1. batch-io提供simulate-file了与您想要的类似的东西,但没有什么比将字符串包装在一个函数中更干净的了,这使得它成为一个像对象这样的文件:
> (simulate-file read-csv-file "test,test,test")
(list (list "test" "test" "test"))
  1. 使用csv-readingcsv-reading必须下载但只是(require csv-reading)继续通过它给你的错误):
#lang racket
(require csv-reading)
> (csv->list "test,test,test")
(list (list "test" "test" "test"))

如果batch-io更笼统,它将采用 astring?或 aninput-port?但它没有。

于 2020-11-09T17:09:59.957 回答
2

我找到了一种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的文档所说:

注意:此表格正在开发中,将在最终定稿后以精确的方式记录下来,并对广大受众有用。

于 2020-11-09T22:23:17.690 回答