我简化了应用逻辑,以更好地说明有趣的点。我们需要三件事:一个模块“driver”,即test_csv。pl,通用加载器,即csv_module_test。pl和至少一个文件,即file.csv
驾驶员:
:- module(test_csv, [test_csv/0]).
:- use_module(csv_module_test).
test_csv :-
context_module(CM),
prepare_db(CM, 'file.csv').
装载机:
:- module(csv_module_test, [prepare_db/2]).
:- use_module(library(csv)).
prepare_db(CM, File) :-
forall(csv_read_file_row(File, Row, []), store_row(CM, Row)).
store_row(CM, Row) :-
Row =.. [row,RelName|Cols],
Record =.. [RelName|Cols],
CM:assertz(Record).
测试数据,文件.csv:
key,desc,col1,col2,col3,col4,col5
key_x,desc_x,1,2,3,4,5
key_y,desc_y,10,20,30,40,50
然后
?- test_csv.
true.
?- test_csv:listing.
:- dynamic rel/3.
test_csv :-
context_module(A),
prepare_db(A, 'file.csv').
:- dynamic key/1.
:- dynamic key_y/6.
key_y(desc_y, 10, 20, 30, 40, 50).
:- dynamic key_x/6.
key_x(desc_x, 1, 2, 3, 4, 5).
:- dynamic key/6.
key(desc, col1, col2, col3, col4, col5).
true.
也就是说,关系已声明为动态的,并在驱动程序模块中声明。。。
注意:关系的名称是假的,因为我一开始试图遵循你的应用逻辑,后来转向了一种简化的方法。。。