Use duck for util-csv exclusively.

This commit is contained in:
Dominik Pantůček 2023-07-04 22:44:43 +02:00
parent 2fb41c172e
commit 77f1de6e36
3 changed files with 20 additions and 28 deletions

View file

@ -51,3 +51,15 @@ Curried version of fast CSV line parser with given separator and string delimite
* ```separator``` - separator character * ```separator``` - separator character
* ```string-delimiger``` - string quotation character * ```string-delimiger``` - string quotation character
* ```line``` - line to parse * ```line``` - line to parse
### csv-parse-lines [procedure]
(csv-parse-lines lines separator: (separator ;) string-delimiter: (string-delimiter "))
Parses given lines and returns list of lists of strings.
### csv-parse [procedure]
(csv-parse fn . args)
Uses ```csv-parse-lines``` on lines read from given file ```fn```.

View file

@ -8,29 +8,6 @@ well.
The modules are listed in alphabetical order. The modules are listed in alphabetical order.
### CSV
(import util-csv)
This module provides a very simple, incomplete and incorrect but fast
CSV loader.
(csv-parse filename
[#:separator #\;]
[#:string-delimiter #\"])
* ```separator``` - cell separator in CSV file
* ```string-delimiter``` - for introducing strings possibly with separators
Parses given CSV file and returns list of lists of strings
representing its contents.
(csv-split-header csv)
* ```csv``` - list of lists of strings
Splits given loaded CSV into two tables at the first empty row.
### Dictionary ### Dictionary
(import util-dict-list) (import util-dict-list)

View file

@ -96,9 +96,10 @@ CSV loader.")
(cons (cons token (car res)) (cdr res)) (cons (cons token (car res)) (cdr res))
2)))))))) ; Continue inside quoted data 2)))))))) ; Continue inside quoted data
;; Parses given CSV lines list ;; Parses given CSV lines list
(define* (csv-parse-lines lines (define*/doc (csv-parse-lines lines
#:separator (separator #\;) #:separator (separator #\;)
#:string-delimiter (string-delimiter #\")) #:string-delimiter (string-delimiter #\"))
("Parses given lines and returns list of lists of strings.")
(let* ((csv-parse-line (make-csv-line-parser separator string-delimiter)) (let* ((csv-parse-line (make-csv-line-parser separator string-delimiter))
(total (max (sub1 (length lines)) 1))) (total (max (sub1 (length lines)) 1)))
(let loop ((lines lines) (let loop ((lines lines)
@ -114,7 +115,8 @@ CSV loader.")
res))))))) res)))))))
;; Loads given CSV file and parses its lines into lists ;; Loads given CSV file and parses its lines into lists
(define (csv-parse fn . args) (define/doc (csv-parse fn . args)
("Uses ```csv-parse-lines``` on lines read from given file ```fn```.")
(call/cc (call/cc
(lambda (ret) (lambda (ret)
(with-exception-handler (with-exception-handler
@ -125,7 +127,8 @@ CSV loader.")
(apply csv-parse-lines lines args))))))) (apply csv-parse-lines lines args)))))))
;; Splits CSV into header and body based on the first empty row. ;; Splits CSV into header and body based on the first empty row.
(define (csv-split-header csv) (define/doc (csv-split-header csv)
("Splits given loaded CSV into two tables at the first empty row.")
(let loop ((body csv) (let loop ((body csv)
(rhead '())) (rhead '()))
(if (null? body) (if (null? body)