From 9532e3b759a456bcb05816e4a9d5439069a199f4 Mon Sep 17 00:00:00 2001 From: Nala Ginrut Date: Thu, 7 Feb 2013 23:40:41 +0800 Subject: [PATCH] Add: csv->xml --- csv.scm | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/csv.scm b/csv.scm index d6f7be6..aaa2153 100644 --- a/csv.scm +++ b/csv.scm @@ -22,7 +22,8 @@ (define-module (csv) #: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 ;;; course :-) Based on code from Ken Anderson , from @@ -76,3 +77,22 @@ (lambda (port) (reverse (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)))))))) + +