我在Prolog中构建了一个模型,当我需要通过编译器生成动态结果时。我想从swi-prolog输出动态结果为csv。但是因为它是动态的,每一刻的列数和行数都在变化。
我的问题是,无论如何我可以重写输出csv文件(覆盖旧文件)?否则,当列和行不断变化时,如何输出结果?
答案 0 :(得分:3)
正如Lurker所说,我认为您只是想确保open/3
的输出模式设置为write
。我有以下我认为你想要的东西。如果需要,可以使标题行和第一列具有特殊属性。改编自(DCG for file output)。
csvfile(Headers,Rows) -->
headerrow(Headers),
normalrows(Rows).
headerrow([]) --> [newline].
headerrow([X]) -->atom(X),[newline].
headerrow([X,Y|Rest]) --> atom(X),atom(', '), headerrow([Y|Rest]).
normalrows([])-->[newline].
normalrows([X|Rest]) --> row(X),normalrows(Rest).
row([H|Rest]) -->
firstitem(H),
restitems(Rest).
firstitem(H)--> atom(H),atom(', ').
restitems([]) --> [newline].
restitems([X]) -->atom(X),[newline].
restitems([X,Y|Rest]) --> atom(X),atom(', '), restitems([Y|Rest]).
atom(A) -->[atom(A)].
output(Stream,newline) :-nl(Stream).
output(Stream,atom(A)):- format(Stream,"~w",[A]).
csvfile_header_rows(File,Header,Rows):-
phrase(csvfile(Header,Rows),Ts),
setup_call_cleanup(
open(File,write,Stream),
maplist(output(Stream),Ts),
close(Stream)
).
示例:
?-csvfile_header_rows('csv_test.csv',[name,age,sex],[[bob,20,m],[wilma,23,f],[bert,34,m]]).