如何在Racket中下载和解析csv文件?

时间:2012-06-04 14:56:54

标签: csv download racket

如何在Racket中下载和解析csv文件?

4 个答案:

答案 0 :(得分:12)

使用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")

答案 1 :(得分:7)

Neil有一个新的库,csv-reading,所以请改用它。

首先,使用raco安装软件包:

raco pkg install csv-reading

要将CSV文件转换为列表,这是一个辅助函数:

(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,它是最新版本(其他答案使用已弃用的版本)。

答案 2 :(得分:3)

这个答案让我得到了我想去的地方,但我想我会为未来的勇敢探险家而欢呼。可以更轻松地调用(可能使用较新版本的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->列表函数会自动创建具有上述默认值的csv-reader。您可以通过将make-csv-reader构造的自定义csv阅读器传递给csv->list来覆盖默认值(例如,如果您有不同的分隔符或者不想删除尾随和引导空格)。

答案 3 :(得分:1)

使用get-pure-port下载文件,然后使用read-csv-file(来自Racket随附的2htdp/batch-io库)来解析数据。

下载文件

#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将验证服务器的证书。阅读有关使用HTTPS时如何启用服务器证书验证的文档(get-pure-port)。

解析数据

#lang racket
(require 2htdp/batch-io)

(read-csv-file "data.csv")  ; Returns a list.