csv to assoc-list
csv to assoc-list
Hello,
Inspired by this thread:
viewtopic.php?f=16&t=4918&p=24159&hilit=csv#p24159
Using the artful-newlisp-master/csv.lsp I get a proper list.
The first sublist contains the column header names.
Now I want to transform the list to a assoc-list where the column header names get inserted in each other line as a assoc-key:
So ("Colname1" "Colname2" ....)
and
Lines (Val1 Val2 ....)
gets
(("Colname1" Val1)("Colname2" Val2) ...)
What is the shortest/best approach?
Regards
Hans-Peter
Inspired by this thread:
viewtopic.php?f=16&t=4918&p=24159&hilit=csv#p24159
Using the artful-newlisp-master/csv.lsp I get a proper list.
The first sublist contains the column header names.
Now I want to transform the list to a assoc-list where the column header names get inserted in each other line as a assoc-key:
So ("Colname1" "Colname2" ....)
and
Lines (Val1 Val2 ....)
gets
(("Colname1" Val1)("Colname2" Val2) ...)
What is the shortest/best approach?
Regards
Hans-Peter
Hans-Peter
Re: csv to assoc-list
Oops,
To early this morning. I think this will do the job.
Regards
To early this morning. I think this will do the job.
Code: Select all
> (map list '(1 2 3) '(4 5 6))
((1 4) (2 5) (3 6))
Hans-Peter
Re: csv to assoc-list
Hello,
My first approach:
Any better?
Rergards
My first approach:
Code: Select all
(load "C:/Programme/newlisp/artful-newlisp-master/csv.lsp")
(setq csvlst(CSV:parse-file "C:/Programme/newlisp/csv_file.csv" ","))
(setq colnames (first csvlst))
(setq csvlst (rest csvlst))
(setq alst (list ))
(dolist (sublst csvlst)
(setq alst(append alst (list(map list colnames sublst))))
)
Rergards
Hans-Peter
Re: csv to assoc-list
someting like:
Code: Select all
(set 'csv '(("a" "b") (1 2) (3 4) (5 6)))
(flat (map (fn(x) (map list (first csv) x)) (rest csv)) 1)
=> (("a" 1) ("b" 2) ("a" 3) ("b" 4) ("a" 5) ("b" 6))
Re: csv to assoc-list
Thanks for the code-sample.
But instead of your result:
I want:
Regards
But instead of your result:
Code: Select all
(("a" 1) ("b" 2) ("a" 3) ("b" 4) ("a" 5) ("b" 6))
Code: Select all
((("a" 1) ("b" 2)) (("a" 3) ("b" 4)) (("a" 5) ("b" 6)))
Hans-Peter
Re: csv to assoc-list
HPW, just use fdb’s code but remove the outer call to flat. That will get you what you want, i.e., “rows”.
(λx. x x) (λx. x x)
Re: csv to assoc-list
Hello,
And finally when I need the assoc list into symbols:
Regards
And finally when I need the assoc list into symbols:
Code: Select all
(map (fn (x) (set(sym(first x))(last x)))assoclst)
Hans-Peter
Re: csv to assoc-list
HPW,HPW wrote:And finally when I need the assoc list into symbols:
Code: Select all
(map (fn (x) (set(sym(first x))(last x)))assoclst)
With the above, you caused me to have a crazy thought. Make a macro that does `let`-type bindings for you, given an assoc list; then, you could write any code under that `let` to do more computations. Having a form of a `let` keeps the bindings local (i.e., does not pollute your top-level).
Here's the macro. (Notice that I'm using your idea to make the bindings.)
Code: Select all
(define-macro (let-alist [alist])
(letex ([bindings]
(map (fn (b) (list (sym (b 0)) (b 1)))
(letex ([alist] [alist]) [alist]))
[body]
(cons 'begin (args)))
(let [bindings] [body])))
Code: Select all
(let-alist '(("a" 3) ("b" 4))
(list a b (+ a b)))
--> (3 4 7)
Code: Select all
(let (asum 0 bsum 0 N 0)
(dolist (alist (csv->alists csv))
(let-alist alist
(inc asum a)
(inc bsum b))
(inc N))
(list 'asum asum 'aavg (div asum N)
'bsum bsum 'bavg (div bsum N)))
--> (asum 9 aavg 3 bsum 12 bavg 4)
Code: Select all
(set 'csv '(("a" "b") (1 2) (3 4) (5 6)))
Code: Select all
(define (csv->alists csv)
(map (fn (x) (map list (first csv) x))
(rest csv)))
(λx. x x) (λx. x x)
Re: csv to assoc-list
Hello rickyboy,
Yes, crazy but also cool. With this powerfull functions from newlisp I found the code harder to read and understand, but thats the power and beauty of newlisp. Thanks for sharing your ideas.
Regards
Yes, crazy but also cool. With this powerfull functions from newlisp I found the code harder to read and understand, but thats the power and beauty of newlisp. Thanks for sharing your ideas.
Regards
Hans-Peter