如何在 Racket 中下载和解析 csv 文件?
4 回答
用于get-pure-port
下载文件,并使用Planet库(require (planet neil/csv)
)对其进行解析。
以下示例下载并解析一个 csv 文件,该文件包含有关各种加拉帕戈斯群岛大小以及每个岛屿上发现的物种数量的数据。
#lang racket
(require (planet neil/csv:1:=7) net/url)
(define galapagos-url
(string->url
"http://www.stat.washington.edu/~handcock/536/Data/galapagos.csv"))
(define make-galapagos-csv-reader
(make-csv-reader-maker
'((separator-chars #\,)
(strip-leading-whitespace? . #t)
(strip-trailing-whitespace? . #t))))
(define (all-rows url make-reader)
(define next-row (make-reader (get-pure-port url)))
(define (loop)
(define row (next-row))
(if (empty? row)
'()
(cons row (loop))))
(loop))
(all-rows galapagos-url make-galapagos-csv-reader)
返回的第一行是:
'(("Island"
"Observed.species"
"Native.species"
"Area(km^2)"
"Elevation(m)"
"Distance.nearest.island(km)"
"Distance.Santa.Cruz(km)"
"Area.adj.island(km^2)")
("Baltra" "58" "23" "25.09" "" "0.6" "0.6" "1.84")
("Bartolome" "31" "21" "1.24" "109" "0.6" "26.3" "572.33")
("Caldwell" "3" "3" "0.21" "114" "2.8" "58.7" "0.78")
Neil 有一个新的库,csv-reading,所以改用它。
首先,使用 raco 安装软件包:
raco pkg install csv-reading
要将 CSV 文件转换为 list,这是一个辅助函数:
(require csv-reading)
(define (csvfile->list filename)
(call-with-input-file filename
csv->list))
要下载 CSV 文件并转换为列表,请执行以下操作:
(require net/url)
((compose csv->list get-pure-port string->url) "http://example.com")
有关 csv-reading 库,请参见此处:csv-reading library,它是最新版本(其他答案正在使用已弃用的答案)。
这个答案让我找到了我想要去的地方,但我想我会为未来的勇敢探险家插话。有一个更简单的调用(也许使用更新版本的 csv 库?)来做你所要求的。这当然假设您想要逗号分隔符,并像上面的示例一样去除前导/尾随空格。
#lang racket
(require (planet neil/csv:2:0) net/url)
;; Continuing with the UW data sources examples
(define iver-url
(string->url
"http://faculty.washington.edu/cadolph/vis/iver.csv"))
(csv->list (get-pure-port iver-url))
在这个版本中,csv->list 函数会自动创建一个具有上述默认值的 csv-reader。make-csv-reader
您可以通过传递使用to构造的自定义 csv 阅读器来覆盖默认值(例如,如果您有不同的分隔符或不想去除尾随和前导空格)csv->list
。
用于get-pure-port
下载文件,然后使用read-csv-file
(来自2htdp/batch-io
Racket 中包含的库)解析数据。
下载文件
#lang racket
(require net/url)
;; Get the data.
(define the-url (string->url "http://www.example.com/data.csv"))
(define the-data (port->bytes (get-pure-port the-url)))
;; Write the data to a file.
(define outfile (open-output-file "data.csv"))
(write-bytes the-data outfile)
(close-output-port outfile)
参考:https ://www.monolune.com/how-to-download-files-using-racket/
警告:默认情况下,当使用 HTTPS 时,Racket不会验证服务器的证书。get-pure-port
阅读有关如何在使用 HTTPS 时启用服务器证书验证的文档 ( )。
解析数据
#lang racket
(require 2htdp/batch-io)
(read-csv-file "data.csv") ; Returns a list.