From c2b8ee926221cc21b76e4451c4b9c764ddb94231 Mon Sep 17 00:00:00 2001 From: Brady McDonough Date: Tue, 19 Jan 2021 02:24:25 -0700 Subject: [PATCH] Added (csv->sxml), also added custom record naming --- csv/csv.scm | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/csv/csv.scm b/csv/csv.scm index 471abef..bcdfa67 100644 --- a/csv/csv.scm +++ b/csv/csv.scm @@ -23,7 +23,7 @@ (define-module (csv csv) #:use-module (ice-9 optargs) #:use-module (sxml simple) - #:export (make-csv-reader csv->xml sxml->csv csv-write)) + #:export (make-csv-reader csv->xml csv->sxml sxml->csv csv-write)) ;;; FIXME: rewrite with some kind of parser generator? functional, of ;;; course :-) Based on code from Ken Anderson , from @@ -79,7 +79,10 @@ (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* (csv->sxml port + #:key + (delimiter #\,) + (record-sym (lambda(n)(format #f "record-~a" n)))) (define reader (make-csv-reader delimiter #:have-row (lambda (row rows) (cons (reverse row) rows)))) @@ -87,13 +90,32 @@ (header (map string->symbol (car csv))) (contents (cdr csv))) (let lp((rest contents) (result '()) (n 1)) - (cond + (cond + ((null? rest) + (reverse result)) + (else + (let* ((line (map list header (car rest))) + (r (string->symbol (record-sym n)))) + (lp (cdr rest) (cons (list r line) result) (1+ n)))))))) + +(define* (csv->xml port + #:key + (delimiter #\,) + (record-sym (lambda (n) (format #f "record-~a" n)))) + (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 '()) (n 1)) + (cond ((null? rest) (call-with-output-string (lambda (p) (sxml->xml (reverse result) p)))) (else (let* ((line (map list header (car rest))) - (r (string->symbol (format #f "record-~a" n)))) + (r (string->symbol (record-sym n)))) (lp (cdr rest) (cons (list r line) result) (1+ n)))))))) (define* (sxml->csv sxml port #:key (delimiter #\,)) @@ -102,5 +124,3 @@ (for-each (lambda (l) (format port "~a~%" l)) csv))) - -(define csv-write sxml->csv)