【问题标题】:How to open a file and search for a word?如何打开文件并搜索单词?
【发布时间】:2010-12-26 04:13:58
【问题描述】:

如何使用 Ruby 打开文件并在其中搜索单词?

【问题讨论】:

  • 你至少搜索过吗?
  • @Mitch:他不需要做搜索,因为他实际上已经问过两次基本上完全相同的问题了。
  • @Whoever 投票结束了这个问题:这个问题可能会惹恼你(因为你希望 OP 搜索或阅读一本书或其他什么),但这是一个清晰而真实的编程问题。如果您愿意,请投反对票,但我看不出它如何违反 SO 的问题指南。具体来说,至少有一位程序员一定会感兴趣,而且文笔清晰简单(语法不谈)。 “详细”的要求很棘手,但我认为这个问题尽可能详细:我如何使用 this twistthis specific thing, using 这种编程语言.
  • @Jorg:他可能没有意识到读取光盘上的文件在原理上与读取您以编程方式抓取的网页是相同的。很多人一开始并没有看到这种联系。您需要了解关于“这只是文件”的整个 *nix-y 知识。
  • 这是您第三次使用 2 个不同的帐户提出相同的问题!

标签: ruby file search file-io


【解决方案1】:
File.readlines(file).each {|l| l.grep(/#{exp_search}/).each {|r| puts file + ' : ' + r}}

【讨论】:

    【解决方案2】:

    这样的事情可能会有所帮助:

    def word_exists_in_file
       f = File.open("your_file.txt") #opens the file for reading
       f.each do line
          print line
          if line.match /your_word_to_match/
             return true
          end
       end
       false
    end
    

    【讨论】:

      【解决方案3】:

      所有提出的解决方案都具有 O(n) 的时间复杂度。为简单起见,我使用String#include? 来检查单词。这可以使用string=~ regex 形式的正则表达式来代替。

      阅读完整的文件并在其中搜索。

      File.read(filename).include?(word)
      

      如果您的文件非常大,这不是最佳解决方案,因为您会将整个文件读入内存并随后开始搜索。你的内存复杂度是 O(n)

      逐行读取文件并在每一行中搜索

      File.open(filename) do |f|
        f.any? do |line|
          line.include?(word)
        end
      end
      

      如果您的文件非常大,但您知道行的上限是一个常数值,那么您现在的内存复杂度为 O(1)。

      读取文件块并在其中搜索

      File.open(filename) do |f|
        tmp= f.read(1024)
        next true if tmp.include?(word)
        until f.eof?
          tmp= tmp[(-1*word.size)..-1] + f.read(1024)
          next true if tmp.include?(word)
        end
        next false
      end
      

      在这个变体中,我们从文件中读取大小相等的块。所以不管文件的条件是什么,我们的内存复杂度都是O(1)

      【讨论】:

      • 哇,很好的解释,比原始问题更深入。非常感谢迷你教程:)
      • 在第三种/分块解决方案中,如果您要搜索的单词跨越了您一次读取的 1024 个字节的边界,那会不会失败?
      • @canhazbits 第 5 行保留前一个块的结尾,以处理搜索的单词跨越块边界的情况。保留多少取决于字的大小。
      【解决方案4】:

      试试 gem 'search_in_file',它可以帮助你在指定文件或多个文件中按路径搜索词组的单词

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        相关资源
        最近更新 更多