2012-06-04 11 views

Respuesta

12

Utilice get-pure-port para descargar el archivo y utilice la biblioteca Planet(require (planet neil/csv)) para analizarlo.

El siguiente ejemplo descarga y analiza un archivo csv que contiene datos sobre el tamaño de las diversas islas Galápagos y cuántas especies se encontraron en cada isla.

#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) 

Las primeras filas devueltas son:

'(("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") 
3

Esta respuesta me llevó a donde yo estaba buscando para ir, pero pensé que interrumpiría para los futuros exploradores intrépidos. Hay una invocación más fácil (tal vez con las versiones más nuevas de la biblioteca csv?) Para hacer lo que pide. Por supuesto, esto supone que desea el delimitador de comas, y para quitar espacio en blanco inicial/final como en el ejemplo anterior.

#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)) 

En esta versión, el csv-> función de lista crea automáticamente un csv-lector con los valores predeterminados antes mencionados. Puede anular los valores predeterminados (por ejemplo, si tiene un delimitador diferente o no quiere quitar espacio en blanco al final y al final) al pasar un lector de csv personalizado construido con make-csv-reader al csv->list.

6

Neil tiene una nueva biblioteca, lectura de csv, así que úsala en su lugar.

Primera, instale el paquete utilizando Raco:

raco pkg install csv-reading 

convertir un archivo CSV a una lista, aquí es una función auxiliar:

(require csv-reading) 

(define (csvfile->list filename) 
    (call-with-input-file filename 
         csv->list)) 

Para descargar un archivo CSV archivar y convertir a una lista, hacer esto:

(require net/url) 
((compose csv->list get-pure-port string->url) "http://example.com") 

Consulte aquí la biblioteca de lectura de csv: csv-reading library, es la versión más reciente (y las demás respuestas utilizan las obsoletas).

Cuestiones relacionadas