【问题标题】:How to download and parse a csv file in Racket?如何在 Racket 中下载和解析 csv 文件?
【发布时间】:2012-06-08 15:38:00
【问题描述】:

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

【问题讨论】:

    标签: csv download racket


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案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->list 函数会自动创建一个具有上述默认值的 csv-reader。您可以通过将使用 make-csv-reader 构造的自定义 csv 阅读器传递给 csv->list 来覆盖默认值(例如,如果您有不同的分隔符或不想去除尾随和前导空格)。

        【讨论】:

          【解决方案4】:

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

          解析数据

          #lang racket
          (require 2htdp/batch-io)
          
          (read-csv-file "data.csv")  ; Returns a list.
          

          【讨论】:

            猜你喜欢
            • 2020-07-01
            • 2017-02-13
            • 1970-01-01
            • 2017-06-10
            • 1970-01-01
            • 1970-01-01
            • 2021-03-21
            • 2011-08-01
            相关资源
            最近更新 更多