导入csv文件数据以填充Prolog知识库

时间:2014-06-07 07:52:33

标签: csv prolog swi-prolog

我有一个csv文件example.csv,其中包含两个标题为var1和var2的列。

enter image description here

我想用重复的事实填充最初空的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]].

1 个答案:

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