从swi-Prolog输出动态结果为csv

时间:2017-06-26 11:03:57

标签: csv prolog

我在Prolog中构建了一个模型,当我需要通过编译器生成动态结果时。我想从swi-prolog输出动态结果为csv。但是因为它是动态的,每一刻的列数和行数都在变化。

我的问题是,无论如何我可以重写输出csv文件(覆盖旧文件)?否则,当列和行不断变化时,如何输出结果?

1 个答案:

答案 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]]).