在Prolog中读取文件

在Prolog中读取文件,prolog,Prolog,我正在尝试读取文件“nomes.csv”,该文件在记事本中如下所示: femin,femin,1,f,woman,women. aqu,aqu,1,f,water,waters. 我曾尝试在SWI Prolog中使用此选项: 18 ?- read(X). X = end_of_file. 19 ?- see('nouns.csv'). true. 20 ?- seeing(X). X = <stream>(000000000017F770). 21 ?- read(X). X

我正在尝试读取文件“nomes.csv”,该文件在记事本中如下所示:

femin,femin,1,f,woman,women.
aqu,aqu,1,f,water,waters.
我曾尝试在SWI Prolog中使用此选项:

18 ?- read(X).
X = end_of_file.

19 ?- see('nouns.csv').
true.

20 ?- seeing(X).
X = <stream>(000000000017F770).

21 ?- read(X).
X = end_of_file.

22 ?- 

我假设我会为nonomes.csv中的每一行创建一个巨大的列表,然后遍历该列表并对每个元素应用nonomeslineparse。我如何才能将我的文件/流放入这个巨大的列表中(或者巨大的列表是一种不好的方式?)

在SWI Prolog中,更简单的方法是library()

如果您需要对读取的项目执行特定的处理,library()可以帮助您。 基本骨架是

:- use_module(library(pure_input)).
:- use_module(library(dcg/basics)).

read_csv(Path, Records) :-
    phrase_from_file(read_csv_file(Records), Path).

read_csv_file([Tokens|Lines]) -->
    read_csv_line(Tokens), read_csv_file(Lines).
read_csv_file([]) --> [].


read_csv_line([Token]) -->
    string(TokenS), ( ".\n" ; "." ), {atom_codes(Token, TokenS)} .
read_csv_line([Token|Tokens]) -->
    string(TokenS), ",", {atom_codes(Token, TokenS)}, !, read_csv_line(Tokens).

您需要非常注意细节…

see
seing
用于阅读Prolog术语的文件,而您的CSV文件不是。谢谢Scott,我已经尝试过@KarolyHorvath:这没有多大帮助。谢谢。如果我做csv_read_文件,它会给我一个巨大的列表,这正是我想要的。
:- use_module(library(pure_input)).
:- use_module(library(dcg/basics)).

read_csv(Path, Records) :-
    phrase_from_file(read_csv_file(Records), Path).

read_csv_file([Tokens|Lines]) -->
    read_csv_line(Tokens), read_csv_file(Lines).
read_csv_file([]) --> [].


read_csv_line([Token]) -->
    string(TokenS), ( ".\n" ; "." ), {atom_codes(Token, TokenS)} .
read_csv_line([Token|Tokens]) -->
    string(TokenS), ",", {atom_codes(Token, TokenS)}, !, read_csv_line(Tokens).