File io Prolog以txt格式读取表格

File io Prolog以txt格式读取表格,file-io,prolog,File Io,Prolog,我在读取包含以下信息的文本文件时遇到问题: T11,R1,6:00-18:00 T12,R1,6:00-18:00 T13,R1,18:00-6:00 现在,如果我在每一行中添加“”并在末尾添加句点,我就有了一个用于阅读它的序言代码。它将其转换为一个列表,但我需要为每一行单独列出。我也试着 使用: 但它不起作用,并显示字符串过长的错误消息 main :- open('taxi.txt', read, Str), read_file(Str,Lines), close(St

我在读取包含以下信息的文本文件时遇到问题:

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

现在,如果我在每一行中添加“”并在末尾添加句点,我就有了一个用于阅读它的序言代码。它将其转换为一个列表,但我需要为每一行单独列出。我也试着 使用:

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

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.*/

read/2不适合解析“自由文本”文件,因为它用于解析完全结构化的Prolog术语,如writeq/1或listing/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_文件的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).

但如果我有很多出租车数据???我如何处理例如T11,R1,6:00-18:00,6,43.668943,,79.386211 11 T12,R1,R1,6:00-18:00,3,43,43.652946,43.652946,79.36363219 9 9.363219,3,3,3,6:00-18:00-18:00-18:00,6,6.3838388943.388943,43.668943,43.668943,43,43,43.668943,43,43.668943,43,43,6.668943,43,7.668943,,,,(79.668943,-79.668943,79.668943,79.383843,79-79.388943,,,,,,,79.388943,79-79.388943,79-79.388943,79.388943,79-79.388943,79.38啊,,-79.386211 T41,R4,6:00-18:00,5,43.668943,-79.386211 T42,R4,18:00-4:00,3,43.668943,-79.386211谢谢你的帮助。
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).