过滤文本文件

时间:2017-11-01 21:26:08

标签: ruby text

我想对文本文件进行排序,只留下某个部分。我在文本文件中有这个文本:

"Mo"

如何对其进行排序,以便只显示人somefile.readlines("filename.txt").grep /Mo}/i 的信息?

这就是我的尝试:

{{1}}

但是没用。

1 个答案:

答案 0 :(得分:1)

<强>代码

def retrieve_block(fname, summary_target)
  arr = []
  File.foreach(fname) do |line|
    next if line.strip.empty? 
    arr << line
    next unless arr.size == 7
    return arr.join if arr[3].match?(/\"summary\"=>\"#{summary_target}\"/)
    arr = []
  end
end

示例

让我们先创建一个文件。

text =<<_
{
  "id"=>"0000001", 
  "type"=>"cashier", 
  "summary"=>"Henock", 
  "self"=>"https://google.com/accounts/0000001", 
  "html_url"=>"https://google.com/accounts/0000001"
}

{
  "id"=>"0000003", 
  "type"=>"cashier", 
  "summary"=>"Mo", 
  "self"=>"https://google.com/accounts/0000003", 
  "html_url"=>"https://google.com/accounts/0000003"
}
_

此字符串中表示的所有键和值都用双引号括起来。然而,在这个问题中,许多这些键和值被特殊字符所包围,这些字符具有双引号的表面外观。我假设这些字符将在预处理步骤中转换为双引号。

FName = "test"
File.write(FName, text)
  #=> 325

puts retrieve_block(FName, "Mo")
{
  "id"=>"0000003",
  "type"=>"cashier",
  "summary"=>"Mo",
  "self"=>"https://google.com/accounts/0000003",
  "html_url"=>"https://google.com/accounts/0000003"
}

这应该有效,因为文件的格式一致。

要返回散列而不是字符串,需要稍作修改。

def retrieve_block(fname, summary_target)
  h = {}
  File.foreach(fname) do |line|
    line.strip!
    next if line.empty? || line == '{'
    if line == '}'
      if h["summary"] == summary_target
        break h
      else
        h = {}
      end
    else
      k, v = line.delete('",').split("=>")
      h[k] = v
    end  
  end
end

retrieve_block(FName, "Mo")
  #=> {"id"=>"0000003",
  #    "type"=>"cashier",
  #    "summary"=>"Mo",
  #    "self"=>"https://google.com/accounts/0000003",
  #    "html_url"=>"https://google.com/accounts/0000003"}