逐行读取文件搜索字符串

时间:2013-03-31 15:32:30

标签: swi-prolog

我有一个纯文本文件和一些随机的数据行,没有什么特别的..我想知道我将如何逐行读取这个文件作为以下伪代码:

arrLines[]
data = open ("x.txt", read, handle)
for line in data
   if line == "stop" then stop reading
   arrLines.add(line)

close(handle)

但我想跳过文件中的第一行。我知道其他语言中非常简单的东西,例如python..ect,我发现很难从文档中学习,因为他们似乎希望你在使用之前已经知道了很多prolog:/

任何人都可以推荐一些资源,在使用之前他们不希望你对prolog有太多了解吗?关于具体含义的更多细节以及使用它们的示例不仅仅是对它的描述

2 个答案:

答案 0 :(得分:0)

让我在prolog的伪代码中制定答案

open the file and
find all lines which contain the string

a line is all characters until newline

我找到了一个动作:https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/1.html

我建议使用apropos(append)来搜索追加或打开等等。它将以可用的结构打开帮助。

看看当swi prolog使用gtrace

评估某些内容时会发生什么
?- gtrace, append([1,2,3], [9], L).

答案 1 :(得分:0)

您可以定义以下谓词来读取从文件到列表的行,停在除“停止”之外的任何行:

read_until_stop(File, [L|Lines]) :-
    read_line_to_codes(File, Codes), Codes \= end_of_file,
    atom_codes(L, Codes),
    L \= stop,
    !, read_until_stop(File, Lines).
read_until_stop(_, []).

文件是一个流对象,为了得到它你可以使用:

open(FileName, read, File).

通过阅读一行来略读一行。研究包含read_line_to_codesatom_codesopen的手册中的部分,它们有很多有用的谓词。同样,您需要了解Prolog的基础知识。

现在这是一种方法,另一种方法是使用DCG。这将是一种适当的“Prolog”方式。在stackoverflow上有很多使用DCG的例子。

如果你问自己为什么这么难做到这一点,那是因为Prolog并不是要用作简单文本处理的工具;有更好的工具(grep,sed,awk,当然还有perl)。

P.S。 Stackoverflow实际上是Prolog中代码示例的重要来源。用SWI-Prolog标记的问题将为您提供SWI-Prolog特定代码的示例。