我正在尝试阅读文件' nouns.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 ?-
我完全没有输入和输出(任何语言)的经验,我很困惑。我认为read(X)会将整个文件作为字符串返回(我认为它是一个流)。我想在每一行中阅读并将此谓词应用于它:
nounstage(Input) -->
["noun("],
[Adjust],
[")."],
{
append(Adjust,[46],Input)
}.
nounlineparse(X,Y) :-
phrase(nounstage(X),N),
flatten(N,Y),
asserta(Y).
我假设我会在nouns.csv中创建一个巨大的每一行列表,然后遍历列表并将nounlineparse应用于每个元素。如何将我的文件/流放入这个巨大的列表中(或者是巨大的列表是一种不好的方式呢?)。
答案 0 :(得分:2)
在SWI-Prolog中,更简单的途径是库(csv)。
如果您需要对阅读项目进行特定处理,库(pure_input)可以为您提供帮助。 基本骨架就像
:- 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).
你需要特别注意细节......