【问题标题】:Reading a file line by line searching for a string逐行读取文件搜索字符串
【发布时间】:2013-03-31 15:32:29
【问题描述】:

我有一个纯文本文件和几行随机数据,没有什么特别的。我想知道我将如何像下面的伪代码那样逐行读取这个文件:

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 了解很多的资源吗?更详细地了解事物的含义以及使用它们的示例,而不仅仅是描述事物的含义

【问题讨论】:

  • 需要指出的是,SWI-Prolog 的文档记录了 Prolog 的这种特殊实现。它不是教程,也不是语言的文档或规范,也不是教科书。你似乎错过了这一点。你可以尝试在谷歌上搜索“prolog tutorial”,你会得到一些很好的指导,尽管我不得不承认,两者都不擅长以适合初学者的可理解方式解释完整的语言。

标签: swi-prolog


【解决方案1】:

您可以定义以下谓词来从文件中读取行到列表中,并在仅包含“stop”的行处停止:

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(_, []).

File 是一个流对象,你可以使用:

open(FileName, read, File).

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

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

如果你问自己为什么做这件事这么难,那是因为 Prolog 并不是用来做简单文本处理的工具;有些工具在这方面做得更好(grep、sed、awk,当然还有 perl)。

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

【讨论】:

    【解决方案2】:

    让我也用 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).
    

    【讨论】:

    • 只要没有评论,我无法改进答案。
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多