Skip to content

Commit b455656

Browse files
committed
Add non-strict parse-numeric option to csv-grammar.
1 parent 9db869b commit b455656

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

lib/chibi/csv-test.sld

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ they are going fast\""))
4343
(test-error (string->csv "1997,\"Ford\",E350" (csv-read->list parser)))
4444
(test '(1997 "Ford" "E350")
4545
(string->csv "1997,\"Ford\",\"E350\"" (csv-read->list parser))))
46+
(let ((parser (csv-parser (csv-grammar '((parse-numeric? . #t))))))
47+
(test '(1997 "Ford" "E350")
48+
(string->csv "1997,\"Ford\",E350" (csv-read->list parser)))
49+
(test '(1997 "Ford" "E350")
50+
(string->csv "1997,\"Ford\",\"E350\"" (csv-read->list parser))))
4651
(test '("1997" "Fo\"rd" "E3\"50")
4752
(string->csv "1997\tFo\"rd\tE3\"50"
4853
(csv-read->list (csv-parser default-tsv-grammar))))

lib/chibi/csv.scm

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
;;> requiring a grammar to specify all of the different options.
88

99
(define-record-type Csv-Grammar
10-
(make-csv-grammar separator-chars quote-char quote-doubling-escapes? escape-char record-separator comment-chars quote-non-numeric?)
10+
(make-csv-grammar separator-chars quote-char quote-doubling-escapes? escape-char record-separator comment-chars quote-non-numeric? parse-numeric?)
1111
csv-grammar?
1212
(separator-chars csv-grammar-separator-chars csv-grammar-separator-chars-set!)
1313
(quote-char csv-grammar-quote-char csv-grammar-quote-char-set!)
1414
(quote-doubling-escapes? csv-grammar-quote-doubling-escapes? csv-grammar-quote-doubling-escapes?-set!)
1515
(escape-char csv-grammar-escape-char csv-grammar-escape-char-set!)
1616
(record-separator csv-grammar-record-separator csv-grammar-record-separator-set!)
1717
(comment-chars csv-grammar-comment-chars csv-grammar-comment-chars-set!)
18-
(quote-non-numeric? csv-grammar-quote-non-numeric? csv-grammar-quote-non-numeric?-set!))
18+
(quote-non-numeric? csv-grammar-quote-non-numeric? csv-grammar-quote-non-numeric?-set!)
19+
(parse-numeric? csv-grammar-parse-numeric? csv-grammar-parse-numeric?-set!))
1920

2021
;; TODO: Other options to consider:
2122
;; - strip-leading/trailing-whitespace?
@@ -41,7 +42,7 @@
4142
;;> (quote-char . #f)))
4243
;;> }
4344
(define (csv-grammar spec)
44-
(let ((grammar (make-csv-grammar '(#\,) #\" #t #f 'lax '() #f)))
45+
(let ((grammar (make-csv-grammar '(#\,) #\" #t #f 'lax '() #f #f)))
4546
(for-each
4647
(lambda (x)
4748
(case (car x)
@@ -68,6 +69,8 @@
6869
(csv-grammar-comment-chars-set! grammar (cdr x)))
6970
((quote-non-numeric?)
7071
(csv-grammar-quote-non-numeric?-set! grammar (cdr x)))
72+
((parse-numeric?)
73+
(csv-grammar-parse-numeric?-set! grammar (cdr x)))
7174
(else
7275
(error "unknown csv-grammar spec" x))))
7376
spec)
@@ -130,6 +133,8 @@
130133
((and (csv-grammar-quote-non-numeric? grammar) (not quoted?))
131134
(or (string->number field)
132135
(error "unquoted field is not numeric" field)))
136+
((and (csv-grammar-parse-numeric? grammar) (not quoted?))
137+
(or (string->number field) field))
133138
(else field))))
134139
(define (finish-row)
135140
(let ((field (get-field)))

0 commit comments

Comments
 (0)