mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
[trep-engine] faster csv list processing
instead of scanning the row 5 times: (length, make-list, append, map, string-join), walk the list once building the accumulator along the way.
This commit is contained in:
parent
c642980456
commit
c3883e703b
@ -470,18 +470,28 @@ in the Options panel."))
|
|||||||
str)
|
str)
|
||||||
(display #\" port))))
|
(display #\" port))))
|
||||||
|
|
||||||
(define max-items (apply max (map length lst)))
|
(define max-items
|
||||||
|
(let lp ((lst lst) (maximum 0))
|
||||||
|
(cond
|
||||||
|
((null? lst) maximum)
|
||||||
|
((pair? lst) (lp (cdr lst) (max maximum (length (car lst)))))
|
||||||
|
(else (error "strify " lst " must be a proper list")))))
|
||||||
|
|
||||||
(define (strify obj)
|
(define (strify obj)
|
||||||
(cond
|
(cond
|
||||||
((not obj) "")
|
((or (null? obj) (not obj)) "")
|
||||||
((string? obj) (string-sanitize-csv obj))
|
((string? obj) (string-sanitize-csv obj))
|
||||||
((number? obj) (number->string (exact->inexact obj)))
|
((number? obj) (number->string (exact->inexact obj)))
|
||||||
((list? obj) (string-join
|
((pair? obj) (let lp ((row obj) (acc '()) (pad max-items))
|
||||||
(map strify
|
(cond
|
||||||
(append obj
|
((zero? pad) (string-concatenate-reverse acc))
|
||||||
(make-list (- max-items (length obj)) #f)))
|
((null? row) (lp '() (cons "," acc) (1- pad)))
|
||||||
","))
|
((pair? row) (lp (cdr row)
|
||||||
|
(cons* (if (pair? (cdr row)) "," "")
|
||||||
|
(strify (car row))
|
||||||
|
acc)
|
||||||
|
(1- pad)))
|
||||||
|
(else (error "strify " obj " must be a proper list")))))
|
||||||
((gnc:gnc-monetary? obj) (strify (gnc:gnc-monetary-amount obj)))
|
((gnc:gnc-monetary? obj) (strify (gnc:gnc-monetary-amount obj)))
|
||||||
(else (object->string obj))))
|
(else (object->string obj))))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user