我有一个csv文件example.csv
,其中包含两个标题为var1和var2的列。
我想用重复的事实填充最初空的Prolog知识库文件import.pl
,而example.csv
的每一行都被视为相同:
fact(A1, A2).
fact(B1, B2).
fact(C1, C2).
如何在SWI-Prolog中对此进行编码?
编辑,根据@Shevliaskovic的回答:
:- use_module(library(csv)).
import:-
csv_read_file('example.csv', Data, [functor(fact), separator(0';)]),
maplist(assert, Data).
当在控制台中运行import.
时,我们完全按照请求的方式更新知识库(知识库直接在内存中更新的事实除外,而不是通过文件和随后的咨询)。
检查setof([X, Y], fact(X,Y), Z).
:
Z = [['A1', 'A2'], ['B1', 'B2'], ['C1', 'C2'], [var1, var2]].
答案 0 :(得分:4)
SWI Prolog有一个内置的过程。
是
csv_read_file(+File, -Rows)
或者您可以添加一些选项:
csv_read_file(+File, -Rows, +Options)
您可以在documentation看到它。有关更多信息
以下是文档的示例:
假设我们想要从我们的CSV文件创建谓词表/ 6 知道每条记录包含6个字段。这可以使用代码完成 下面。如果没有选项arity(6),这将生成一个谓词 table / N,其中N是数据中每条记录的字段数。
?- csv_read_file(File, Rows, [functor(table), arity(6)]),
maplist(assert, Rows).
例如:
如果你有一个类似的File.csv:
A1 A2
B1 B2
C1 C2
您可以将其导入SWI,如:
9 ?- csv_read_file('File.csv', Data).
结果将是:
Data = [row('A1', 'A2'), row('B1', 'B2'), row('C1', 'C2')].