Add: csv->xml

master
Nala Ginrut 13 years ago
parent a68a32fa5f
commit 9532e3b759

@ -22,7 +22,8 @@
(define-module (csv) (define-module (csv)
#:use-module (ice-9 optargs) #:use-module (ice-9 optargs)
#:export (make-csv-reader)) #:use-module (sxml simple)
#:export (make-csv-reader csv->xml))
;;; FIXME: rewrite with some kind of parser generator? functional, of ;;; FIXME: rewrite with some kind of parser generator? functional, of
;;; course :-) Based on code from Ken Anderson <kanderson bbn com>, from ;;; course :-) Based on code from Ken Anderson <kanderson bbn com>, from
@ -76,3 +77,22 @@
(lambda (port) (lambda (port)
(reverse (reverse
(csv-read port delimiter new-row have-cell have-row init-seed)))) (csv-read port delimiter new-row have-cell have-row init-seed))))
;; read csv file and convert to sxml
(define* (csv->xml port #:key (delimiter #\,))
(define reader (make-csv-reader delimiter
#:have-row (lambda (row rows)
(cons (reverse row) rows))))
(let* ((csv (reader port))
(header (map string->symbol (car csv)))
(contents (cdr csv)))
(let lp((rest contents) (result '()))
(cond
((null? rest)
(call-with-output-string (lambda (p)
(sxml->xml (reverse result) p))))
(else
(let ((line (map list header (car rest))))
(lp (cdr rest) (cons line result))))))))

Loading…
Cancel
Save