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