【问题标题】:ruby compare string with file contentsruby 将字符串与文件内容进行比较
【发布时间】:2016-08-04 15:47:33
【问题描述】:

我的最终目标是将文件中的值与我从数据库中提取的记录进行比较。

我有一个结构如下的文本文件:

123,55,66
555,99,109
324,100,800
467,200,300

然后我从数据库中拉回记录并逐一循环它们。

sth.fetch do |row|
  validate = "#{row[0]},#{row[20]},#{row[21]}"
  names = File.readlines('results.txt')
  matches = names.select { |name| name[/#{validate}/i] }
  p "Result matches as expected: #{matches}"
end

所以 validate 为我构建了与上面示例相同的格式字符串...然后我读取文件的所有行并将它们移动到一个数组中,然后进行比较。所以这很棒,它给了我所有匹配项,但没有告诉我文件中不存在的行?

所以我也试过了

    sth.fetch do |row|
      File.open('results') do |f|
        f.each_line do |line|
          if line == validate
            puts "detail: #{line}"
          else
            puts "detail: #{validate}"
          end
        end
      end
end

但是这会读取每一行的每一行并进行比较,所以它一半实现了我所追求的。

所以我想获取我的“验证”字符串并读取文件的内容以查看行是否匹配,然后打印出它是匹配的。或者,如果我拉回一条记录并且它与文件不匹配,那么我只想要一条不匹配消息。

谢谢

【问题讨论】:

  • 在循环中使用names = File.readlines('results.txt')File.open('results') 是个坏主意,因为这会浪费CPU/磁盘时间。读取循环外的数据,然后访问循环内的变量。 File.foreach(...)File.open(...) do |f| f.each_line do ... 更简单、更清晰
  • 正在读取的文件有多大?您是否有更多的文件是命中而不是未命中,或相反,或均匀分布?
  • 分布相当均匀,目前只有几百个,所以没什么大不了的

标签: arrays ruby string


【解决方案1】:

我会尝试以下方法

 names = File.readlines('results.txt').map(&:chomp) 
 sth.fetch do |row|
   validate = "#{row[0]},#{row[20]},#{row[21]}"

    # for direct compare
    # if names.include?(validate)
    # Or for Regexp
    if names.grep(/#{validate}/i).any?
      p "Result matches as expected: #{matches}" 
    else
      p "Result does not matches as expected: #{matches}" 
    end  
 end

 all_matches.uniq!

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-01-21
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多