我遇到了阅读包含此信息的文本文件的问题:
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.*/
答案 0 :(得分:2)
通常,解析文件的更简单方法是使用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).