I have a text file containing integers in different lines which I want to read into a list of lists.
So
01
11 14
45 50 09
should become
((1)
(11 14)
(45 50 9))
The real file is longer so I want to read it in using CL instead of transforming it using Emacs' macros etc. It is important that every line becomes exactly one list and the data is stored as integers, i.e. 09 becomes 9.
I ended up with the following (using the external library split-sequence):
(defun read-data (&optional (file "data.txt"))
"Returns the numerical data in FILE as a list of lists."
(with-open-file (data file)
(loop :for line = (read-line data nil nil)
:while line
:collect (map 'list #'parse-integer (split-sequence #\Space line)))))
which is great because it does the job, I needed only two minutes for it and I knew exactly what I wanted to do. Nevertheless, I found the chain read-line
, split-sequence
and map
a bit too much for this rather simple job. Is there a simpler way just using read
which I am just missing?