1

我有一个文件如下(数字以空格分隔,行以点结尾):

4554 3332 3 23 344.     
4 2 3 5 7 86 56.     
7 8 1 4 66.

我想创建一个列表列表,每一行一个列表,如下所示:

[[4554,3332,3,23,344],[4,2,3,5,7,86,56],[7,8,1,4,66]]

我能怎么做?非常感谢您

4

1 回答 1

3

我建议使用明确的子句语法 (DCG) 和 DCG/basics 库,如下所示:

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

number_line([]) --> ".".
number_line([N|Ns]) --> integer(N), whites, number_line(Ns).

file([Line|Lines]) --> number_line(Line), blanks, file(Lines).
file([]) --> [].

然后,您可以使用如下简单的谓词一次解析整个文件:

parse_integer_file(File, Lists) :-
    phrase_from_file(file(Lists), File).

使用您的示例数据进行尝试file.txt

?- parse_integer_file('input.txt', R).
R = [[4554, 3332, 3, 23, 344], [4, 2, 3, 5, 7, 86, 56], [7, 8, 1, 4, 66]] .

这种方法有几个优点:

  • 图书馆 DCG 规则经过实战考验且有效
  • 因此,该语法已经对额外的空格和额外的空行具有弹性
  • 代码比相应的手动输入/输出和拆分更简洁易读
  • 提供的纯 I/O 设施parse_from_file/2非常高效
于 2013-04-24T04:58:29.817 回答