2014-06-07 58 views
3

我有一個csv文件example.csv,它包含兩個標題爲var1和var2的列。導入csv文件數據以填充Prolog知識庫

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]]. 

回答

4

SWI Prolog有一個內置的過程這一點。

這是

csv_read_file(+File, -Rows) 

也可以添加一些選項:

csv_read_file(+File, -Rows, +Options) 

你可以在documentation看到它。欲瞭解更多信息

這裏是一個文檔有例如:

假設我們想從我們 知道包含每個記錄6個領域的CSV文件創建謂詞表/ 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')]. 
+0

Thx,我對Prolog很新。我正在努力處理您的建議。問題是如何將特定的csv文件的內容轉換爲新的知識庫文件,然後可以隨時諮詢。 – user2030503

+2

@ user2030503我添加了一個例子。這對你有幫助嗎? – Shevliaskovic

+0

差不多,我該如何將數據轉換成知識庫文件中的事實? – user2030503