Записать элемент списка в csv в прологе

мне нужно записать в файл csv с помощью csv_write_file.
Мой фактический код:

insert(T, File, Data) :-
    Data = [X | Xs],
    X =.. [_, _, A, B, C],
    csv_write_file(File, [row(A, B, C)], [separator(0'\t)]),
    insert(T, File, Xs).

Данные представляют собой такой список:

[test(name, a, b, c), test(name, d, e, f), test(name, g, h, i)].

В конце файл содержит только последний элемент списка --› g h i

но я хочу такой файл:

a b c
d e f
g h i

Что не так с моей реализацией? Спасибо.


person ldm    schedule 14.11.2020    source источник


Ответы (1)


Это происходит потому, что csv_write_file/3 каждый раз перезапускает запись в файл File. Итак, в конце он возьмет g, h, i и запишет их в файл.

Вы можете массово обрабатывать данные в список row/3, а затем записывать их в файл:

map_item(P, row(A, B, C)) :-
    P =.. [_, _, A, B, C].

insert(T, File, Data) :-
    maplist(map_item, Data, Rows),
    csv_write_file(File, Rows, [separator(0'\t)]).
person Willem Van Onsem    schedule 14.11.2020