views:

373

answers:

1

I have a file that looks like this:

A B C D E
0 8 6 12 5
8 0 10 8 9
6 10 0 7 11
12 8 7 0 6
5 9 11 6 0

I don't know ahead of time how many rows and columns there will be. I would like to read the top line, which will let me know the number of rows to expect . I found lisp's (read <stream>) function which, in a loop, can parse each of the characters as symbols. I have not found a way, however, to limit the loop to only reading the first line and stopping there. The solution I'm trying to make work would be something like

(with-open-file (stream "/home/doppler/tmp/testcase1.txt")
  (setf line (read-line stream))
  (when line
    (loop for symbol = (read line nil)
         while symbol do (print symbol))))

The problem with this is that (read-line stream) returns a string which cannot be parsed by (read line nil) to extract the symbols (s-expressions).

How can I either convert the string line to a stream, or, if possible, extract the symbols directly from the string?

+3  A: 

You can either use the string as a stream by using the with-input-from-string macro, or use read-from-string in a loop. You may also be interested in the read-delimited-list function, although you would have to add some kind of delimiter character to the end of the string before using it.

Matthias Benkard
I ended up using the read-from-string. The read-delimited-list function looks useful, but I haven't quite gotten used to reading the LISP documentation yet so I'm not quite sure how to use it. Thanks!
royvandewater