2012-06-04 2 views

risposta

12

Utilizzare get-pure-port per scaricare il file e utilizzare la libreria per analizzarlo.

L'esempio seguente scarica e analizza un file csv contenente i dati sulla dimensione delle varie isole Galapagos e su quante specie sono state trovate su ciascuna isola.

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

Le prime righe restituite sono:

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

Questa risposta mi ha fatto in cui stavo cercando di andare, ma ho pensato di carillon per i futuri esploratori intrepidi. C'è un'invocazione più semplice (forse con le versioni più recenti della libreria csv?) Per fare ciò che chiedi. Ciò ovviamente presuppone che si desideri il delimitatore di virgola e che si rimuovano gli spazi bianchi iniziali o finali come nell'esempio precedente.

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

In questa versione, il CSV> funzione di lista crea automaticamente un csv-reader con le impostazioni predefinite di cui sopra. Puoi sovrascrivere i valori predefiniti (ad esempio se avevi un delimitatore diverso o non volevi eliminare il trailing e condurre gli spazi bianchi) passando invece un lettore csv personalizzato costruito con make-csv-reader a csv->list.

6

Neil ha una nuova libreria, lettura csv, quindi usa quello.

primo, installare il pacchetto utilizzando raco:

raco pkg install csv-reading 

convertire un file CSV a un elenco, qui è una funzione di supporto:

(require csv-reading) 

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

Per scaricare un file CSV file e convertire in una lista, fare questo:

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

Vedere qui per la libreria di lettura csv: csv-reading library, è l'ultima versione (e le altre risposte utilizzano quelle deprecate).

Problemi correlati