如何使用read-csv-file代替字符串读取?

问题描述

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

文档说:

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

可能可以利用标准输入功能来实现此目的,但我不知道如何继续执行此想法。

解决方法

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

  1. batch-io提供的simulate-file与您想要的东西类似,但是没有比将字符串包装到将其包装到类似对象的文件的函数中更干净的东西了:
> (simulate-file read-csv-file "test,test,test")
(list (list "test" "test" "test"))
  1. 使用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的文档所述:

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