2009-10-03 8 views
7

zu streamen Ich habe eine Datei, die wie folgt aussieht:ein Lisp-String

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 

ich nicht im Voraus wissen, wie viele Zeilen und Spalten werden es sein. Ich würde gerne die obere Zeile lesen, die mir die Anzahl der zu erwartenden Zeilen anzeigt. Ich fand Lisp (read <stream>) Funktion, die in einer Schleife jedes der Zeichen als Symbole analysieren kann. Ich habe jedoch keinen Weg gefunden, die Schleife so einzuschränken, dass nur die erste Zeile gelesen und dort gestoppt wird. Die Lösung Ich versuche, Arbeit zu machen würde mit so etwas wie

(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)))) 

Das Problem ist, dass (read-line stream) einen String zurückgibt, die nicht durch (read line nil) analysiert werden kann, die Symbole zu extrahieren (s-Ausdrücke).

Wie kann ich die Zeichenkette entweder in einen Strom konvertieren oder, wenn möglich, die Symbole direkt aus der Zeichenkette extrahieren?

Antwort

6

Sie können die Zeichenfolge entweder als Stream verwenden, indem Sie das Makro with-input-from-string verwenden, oder read-from-string in einer Schleife verwenden. Möglicherweise interessiert Sie auch die read-delimited-list-Funktion, obwohl Sie am Ende der Zeichenfolge eine Art Trennzeichen vor der Verwendung hinzufügen müssen.

+0

Ich endete mit der Read-from-String. Die Read-Delimited-List-Funktion scheint nützlich zu sein, aber ich habe mich noch nicht daran gewöhnt, die LISP-Dokumentation zu lesen, daher bin ich mir nicht sicher, wie ich sie benutzen soll. Vielen Dank! – royvandewater