我有一个由编译器生成的文件,其中包含以下格式的警告消息:
--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次,我想读取他们一次,即唯一他们。我在考虑读取数组中的整个文件,然后根据代码来唯一它?但这是可能的吗?在我开始编写代码之前。
非常感谢您的意见/帮助/想法:)
发布于 2012-01-04 03:31:28
Hash结构提供了一种捕获此类信息的简单方法。如果您可以提取密钥,那么只需捕获所需的数据块,然后替换它,或者使用第一个实例。
示例:
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
这是从日志文件中提取分隔信息的常见模式。当然,您需要调整开始和结束正则表达式。
发布于 2012-01-04 04:27:27
如果文件太大,读取数组中的整个文件在内存方面的效率可能会非常低。在这种情况下,建议使用逐行浏览文件并收集所需数据的方式。
如果你所需要的仅仅是代码,那么你可以这样做:
codes = {}
File.foreach("logfile") do |line|
if m = line.match(/Warning-\[(.+?)\]/)
codes[m[1]] = nil
end
end
codes.keys
或者使用Ruby的Set
require 'set'
codes = Set.new
File.foreach("logfile") do |line|
if m = line.match(/Warning-\[(.+?)\]/)
codes.add(m[1])
end
end
https://stackoverflow.com/questions/8717433
复制相似问题