我如何使用 read-csv-file 来读取字符串?

How can I use read-csv-file to read from a string instead?

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

文档说:

reads the standard input device (until closed) or the content of file f and produces it as a list of lists of comma-separated values.

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

2htdp 库适用于初学者,因此不如其他 csv 库灵活。因此,您有两个选择:

  1. batch-io 提供了 simulate-file ,这与您想要的类似,但没有什么比将字符串包装在一个函数中更干净的了,该函数使它成为一个文件,如 object:
> (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 更通用,它会接受 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 的文档所说:

Note: this form is under development and will be documented in a precise manner after it is finalized and useful for a wide audience.