Prolog在txt中读表

时间:2013-10-23 19:48:17

标签: file-io prolog

我遇到了阅读包含此信息的文本文件的问题:

T11,R1,6:00-18:00 T12,R1,6:00-18:00 T13,R1,18:00-6:00

现在,如果我添加''在每一行和最后的时期。它将它转换为一个List,但每行需要单独的列表。我也试过 使用方法:

/*rows(Total,Rows_list):-
    atomic_list_concat(Rows_list,nl, Total),
    write(Rows_list), nl.*/

但它不起作用并显示太长字符串的错误消息。

main :-
    open('taxi.txt', read, Str),
    read_file(Str,Lines),
    close(Str),
    write(Lines),
    nl.

read_file(Stream,[]) :-
    at_end_of_stream(Stream).

read_file(Stream,[X|L]) :-
    \+ at_end_of_stream(Stream),
    read(Stream,X),
    read_file(Stream,L).
/*rows(Total,Rows_list):-
    atomic_list_concat(Rows_list,nl, Total),
    write(Rows_list), nl.*/

1 个答案:

答案 0 :(得分:2)

read / 2不适合解析'自由文本'文件,因为它意味着解析完全结构化的Prolog术语,比如writeq / 1或者列出/ 0。

通常,解析文件的更简单方法是使用DCG。由于它是逐字符的解析,因此您需要注意细节:

:- [library(dcg/basics)].

read_file(Stream,[]) :-
    at_end_of_stream(Stream).

read_file(Stream,[X|L]) :-
    \+ at_end_of_stream(Stream),
    read_line_to_codes(Stream, Codes),
    ( phrase(parse_record(Record), Codes) -> assertz(Record) ; writeln('ERROR')),
    read_file(Stream,L).

parse_record(taxi(T1, R1, (H1:M1)-(H2:M2),
       T2, R2, (H3:M3)-(H4:M4),
       T3, R3, (H5:M5)-(H6:M6))) -->
    parse_triple(T1,R1, (H1:M1)-(H2:M2)), " ",
    parse_triple(T2,R2, (H3:M3)-(H4:M4)), " ",
    parse_triple(T3,R3, (H5:M5)-(H6:M6)).

parse_triple(T,R, (H1:M1)-(H2:M2)) -->
    string(Ts), ", ", string(Rs), ", ",
    integer(H1), ":", integer(M1),
    "-", integer(H2), ":", integer(M2),
{atom_codes(T,Ts), atom_codes(R,Rs)}.

DCG的一个有用功能是可以相当容易地测试内联数据:

?- phrase(parse_record(R),"T11, R1, 6:00-18:00 T12, R1, 6:00-18:00 T13, R1, 18:00-6:00").
R = taxi('T11', 'R1', (6:0)- (18:0), 'T12', 'R1', (6:0)- (18:0), 'T13', 'R1', (18:0)- (6:0)) 

编辑我肯定需要更多咖啡,因为我没有注意到你传递给read_file的list参数。代码应该是

read_file(Stream,[X|L]) :-
    \+ at_end_of_stream(Stream),
    read_line_to_codes(Stream, Codes),
    ( phrase(parse_record(X), Codes) -> true ; writeln('ERROR')),
    read_file(Stream,L).