Как загрузить и проанализировать файл 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
.