Как загрузить и проанализировать файл csv в Racket?

Как загрузить и проанализировать файл csv в 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-чтения, это последняя версия (а в других ответах используются устаревшие).

Ответ 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-ридер с указанными выше значениями по умолчанию. Вы можете переопределить значения по умолчанию (например, если у вас был другой разделитель или вы не хотите разделять конечные и ведущие пробелы), вместо этого передайте свой пользовательский csv-ридер, построенный с make-csv-reader до csv->list.