首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby在文本文件中查找单词并对每个标题进行计数?

Ruby在文本文件中查找单词并对每个标题进行计数?
EN

Stack Overflow用户
提问于 2014-02-25 19:59:38
回答 4查看 351关注 0票数 0

下面的字符串位于一个文件中。这三个人都在同一个文件里。它可能会上升到头部N。

从下面的字符串中,我想要一个类似于

头-1 4未启动

为头-2开始

对于头-3 1已开始,2未启动

代码语言:javascript
复制
HEAD-1
========
NE      Server
ASDF    192.168.1.1     not started
ASDF1   192.168.1.1     not started
ASDF2   192.168.1.1     not started
ASDF3   192.168.1.1     not started

HEAD-2
========
NE      Server
ASDF    192.168.1.1     started
ASDF1   192.168.1.1     started

HEAD-3
========
NE      Server
ASDF    192.168.1.1     not started
ASDF1   192.168.1.1     started
ASDF3   192.168.1.1     not started

我只是在Ruby中尝试使用RegExp,通过将所有的头都放到一个数组中,然后将所有的NE项放到另一个2D数组中。

代码语言:javascript
复制
(.*\n{1})(==*\s+)(.\s+)

这是只匹配到NE服务器,我希望regex匹配多行。

我可能在regex方法上错了,然后我必须尝试用不同的方法。

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-25 20:23:09

使用正则表达式,string保存整个字符串。应该对正则表达式进行改进以用于生产,例如,只在正确的位置搜索已启动/未开始,而不是在整个字符串(包括服务器名称等)中进行搜索。

代码语言:javascript
复制
status = {}
string.scan(/^(HEAD-\d+)(.*?)(?:\n\n|\Z)/m).each do |match|
  name, text = match
  started = text.scan(/(?<!not )started/).size
  not_started = text.scan(/not started/).size
  status[name] = {
    started: started,
    not_started: not_started
  }
end

status
# => {"HEAD-1"=>{:started=>0, :not_started=>4}, "HEAD-2"=>{:started=>2, :not_started=>0}, "HEAD-3"=>{:started=>1, :not_started=>2}}
票数 1
EN

Stack Overflow用户

发布于 2014-02-25 20:23:39

如果您可以假设输入将被格式化为您的示例(即每行有一个服务器,在自己的行上设置"HEAD“标题,等等)。您可以使用gets一次获得一行输入,然后将每一行与正则表达式(如^(\w+) (\d+\.\d+\.\d+\.\d+) (.+) )匹配。在这个正则表达式中,您只需检查最后一个组是否“未启动”。如果是的话,将一个添加到未启动服务器的计数中。如果没有,请在已启动服务器的计数中添加一个。如果regex不匹配,请检查它是否匹配^HEAD-(\d+)或类似的内容。

票数 0
EN

Stack Overflow用户

发布于 2014-02-25 20:28:26

下面是我对CSV的不同尝试:

代码语言:javascript
复制
require 'csv' 

csv_string = <<_
HEAD-1
========
NE      Server
ASDF    192.168.1.1     not started
ASDF1   192.168.1.1     not started
ASDF2   192.168.1.1     not started
ASDF3   192.168.1.1     not started

HEAD-2
========
NE      Server
ASDF    192.168.1.1     started
ASDF1   192.168.1.1     started

HEAD-3
========
NE      Server
ASDF    192.168.1.1     not started
ASDF1   192.168.1.1     started
ASDF3   192.168.1.1     not started
_

options = {:col_sep => " " ,:skip_blanks => true ,:skip_lines => /[=]+/ }

csv_array = CSV.parse(csv_string,options)

csv_array.slice_before { |a| a.first[/head-\d+/i] }.to_a
# => [[["HEAD-1"],
#      ["NE", "Server"],
#      ["ASDF", "192.168.1.1", "not", "started"],
#      ["ASDF1", "192.168.1.1", "not", "started"],
#      ["ASDF2", "192.168.1.1", "not", "started"],
#      ["ASDF3", "192.168.1.1", "not", "started"]],
#     [["HEAD-2"],
#      ["NE", "Server"],
#      ["ASDF", "192.168.1.1", "started"],
#      ["ASDF1", "192.168.1.1", "started"]],
#     [["HEAD-3"],
#      ["NE", "Server"],
#      ["ASDF", "192.168.1.1", "not", "started"],
#      ["ASDF1", "192.168.1.1", "started"],
#      ["ASDF3", "192.168.1.1", "not", "started"]]]
report = csv_array.slice_before { |a| a.first[/head-\d+/i] }.map do|inner_ary|
  key,_ = inner_ary.shift(2)
  not_started,started = inner_ary.partition { |a| a.join(" ")[/\s+not\s+started$/] }
  key.push(["started #{started.size}","not started #{not_started.size}"])
end
Hash[report]
# => {"HEAD-1"=>["started 0", "not started 4"],
#     "HEAD-2"=>["started 2", "not started 0"],
#     "HEAD-3"=>["started 1", "not started 2"]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22024855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档