首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Ruby中对其进行唯一标识?

如何在Ruby中对其进行唯一标识?
EN

Stack Overflow用户
提问于 2012-01-04 03:16:17
回答 2查看 93关注 0票数 0

我有一个由编译器生成的文件,其中包含以下格式的警告消息:

代码语言:javascript
运行
复制
--a couple of lines of text--

    Warning-[code1] <some description>
    <some path>, error code
    --3-4 lines of cryptic messages--

    Warning-[code2] <some description>
    <some path>, error code
    --3-4 lines of cryptic messages--

    Warning-[code1] <some description>
    <some path>, error code
    --3-4 lines of cryptic messages--

    etc...

我有一个脚本,将在代码中读取,但问题是,一些代码是重复10次,我想读取他们一次,即唯一他们。我在考虑读取数组中的整个文件,然后根据代码来唯一它?但这是可能的吗?在我开始编写代码之前。

非常感谢您的意见/帮助/想法:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-04 03:31:28

Hash结构提供了一种捕获此类信息的简单方法。如果您可以提取密钥,那么只需捕获所需的数据块,然后替换它,或者使用第一个实例。

示例:

代码语言:javascript
运行
复制
capturing = nil
captured = { }

while (line = gets)
  if (line.match(/...starting...(code).../))
    capturing = ''
    key = $1
  elsif (capturing and line.match(/...finishing.../)
    captured[key] ||= capturing
    capturing = nil
  elsif (capturing)
    capturing << line
  end
end

这是从日志文件中提取分隔信息的常见模式。当然,您需要调整开始和结束正则表达式。

票数 2
EN

Stack Overflow用户

发布于 2012-01-04 04:27:27

如果文件太大,读取数组中的整个文件在内存方面的效率可能会非常低。在这种情况下,建议使用逐行浏览文件并收集所需数据的方式。

如果你所需要的仅仅是代码,那么你可以这样做:

代码语言:javascript
运行
复制
codes = {}

File.foreach("logfile") do |line|
  if m = line.match(/Warning-\[(.+?)\]/)
    codes[m[1]] = nil
  end
end

codes.keys

或者使用Ruby的Set

代码语言:javascript
运行
复制
require 'set'

codes = Set.new

File.foreach("logfile") do |line|
  if m = line.match(/Warning-\[(.+?)\]/)
    codes.add(m[1])
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8717433

复制
相关文章

相似问题

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