You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prolog实操:如何跳过CSV表头并将数据转为可查询Term?

解决SWI-Prolog CSV导入的两个问题:跳过表头与生成可查询谓词

1. 跳过CSV表头行

方法一:使用csv_read_file内置选项(最简便)

SWI-Prolog的csv_read_file支持skip_header(N)选项,指定跳过前N行即可直接忽略表头:

:- use_module(library(csv)).

get_data(Rows) :- 
    csv_read_file("Data.csv", Rows, [skip_header(1)]).

执行查询后结果:

?- get_data(Rows).
Rows = [row('A', 150), row('B', 300), row('C', 50)].

方法二:使用csv_read_stream手动跳过表头

通过流操作实现,先打开文件、丢弃表头行,再读取剩余数据:

:- use_module(library(csv)).

get_data(Rows) :-
    open("Data.csv", read, Stream),
    read_line_to_string(Stream, _),  % 读取并丢弃表头行
    csv_read_stream(Stream, Rows),
    close(Stream).

2. 将CSV数据转为可交互式查询的Prolog谓词

要实现?- row(Name, Value), Value > 150.这类查询,需将CSV数据断言到Prolog知识库中,完整代码如下:

:- use_module(library(csv)).
:- dynamic row/2.  % 声明动态谓词,允许运行时添加事实

% 加载CSV数据到知识库
load_data :-
    csv_read_file("Data.csv", Rows, [skip_header(1)]),
    maplist(assert_row, Rows).

% 辅助谓词:将单个row结构转为知识库事实
assert_row(row(Name, Value)) :-
    assertz(row(Name, Value)).

使用步骤:

  1. 加载代码后执行load_data.完成数据导入
  2. 执行查询:
?- row(Name, Value), Value > 150.
Name = 'B',
Value = 300.

内容的提问来源于stack exchange,提问作者Methodox Charles Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:56:04