2017-03-12 6 views
0

Ich versuche, in einer Datei zu lesen und die Zeichen mit Leerzeichen als Trennzeichen aufgeteilt. Ich habe es geschafft, die Eingabe in eine Liste von Atomen zu unterteilen, aber ich stehe fest und versuche, sie wieder zusammenzusetzen. Dies ist mein Code so weit:Lesen und Zeichenüber eine Datei

tokenize_file(Name, Ret) :- 
    open(Name, read, Str), 
    read_file(Str, Ret), 
    close(Str). 

read_file(Stream,[]) :- 
    at_end_of_stream(Stream). 
read_file(Stream,[X|L]) :- 
    \+ at_end_of_stream(Stream), 
    get0(Stream, Char), 
    write([X, Code]), nl, 
    read_file(Stream,L). 

Dieses eine Ausgabe erzeugt, die wie folgt aussieht:

X = [i, n, t, ' ', a, d, d, ' ', '('|...] 

Was ich nicht, um herauszufinden, ist offenbar, wie durch diese Liste iterieren und verketten jede Zeichensatz zwischen Leerzeichen in eine andere Liste. Ich habe mich umgeschaut, aber ich habe Mühe zu verstehen, wie man Listen in Prolog manipuliert.

+1

können Sie eine Datei analysieren mit einer Grammatik mit 'library (pio)'. Das wäre viel effizienter, da es nur einen konstanten Overhead hat (dh unabhängig von der Größe der Datei), während Ihre Methode Platz benötigt, der proportional zur Größe der Datei ist. – false

+0

Anstatt Ihre eigene Frage in Ihrer Frage zu beantworten, sollten Sie sie als Antwort hinzufügen. Das ist auf der Website erlaubt. Dann können Sie Ihre eigene Antwort akzeptieren, wenn Sie es wünschen. Wenn es in die Frage eingebettet ist, ist es für andere schwieriger zu finden. – lurker

+0

Bitte schreiben Sie Ihre Lösung erneut als Antwort, nicht als Bearbeitung der Frage. Vielen Dank! – halfer

Antwort

0

die Lösung gefunden:

tokenize_file(Name, Ret) :- 
    open(Name, read, Str), 
    read_file(Str, Lst), 
    atomic_list_concat(Lst, '', AtmConcat), 
    split_string(AtmConcat, " ", "", Ret), 
    close(Str). 

Die Atom-Liste concat erstellt die Eingabezeichenfolge (wahrscheinlich effizienter könnte geschehen, dass durch Zeichen in Zeichen zu lesen, aber es funktioniert). Die geteilte Zeichenfolge teilt die Zeichenfolge dann durch Leerzeichen auf. Beachten Sie, dass Zeilenumbrüche wurden tatsächlich unterschiedlich markiert, so wurde der Rest des Codes auch geändert:

read_file(Stream,[X|L]) :- 
    \+ at_end_of_stream(Stream), 
    get0(Stream, Code), 
    set_value(X, Code), 
    read_file(Stream,L). 

set_value(X, 10) :- 
    char_code(X, 32). 

set_value(X, Code) :- 
    char_code(X, Code). 

Diese alle Zeilenumbrüche mit Leerzeichen ersetzt (ASCII-Zeichen 10 repräsentiert eine neue Zeile)