2017-04-12 81 views
1

我有一个文件,其中包含数百个对象和数值组合,如下所示。我想从用户获得输入作为对象名称&数值并返回相关值。Ruby - 将文件解析为哈希

Object cefcFRUPowerOperStatus 
Type PowerOperType 
     1:offEnvOther 
     2:on 
     3:offAdmin 
     4:offDenied 
     5:offEnvPower 
     6:offEnvTemp 

Object cefcModuleOperStatus 
Type ModuleOperType 
     1:unknown 
     2:ok 
     3:disabled 
     4:okButDiagFailed 
     5:boot 
     6:selfTest 

例如, - 输入 -

  objectName = 'cefcModuleOperStatus' 

      TypeNumber = '4' 

回归 - “okButDiagFailed”

我不知道红宝石和得到这个工作来帮助我的同行。所以请原谅,如果这是一个新手问题。

注意: - 我必须创建文件,以任何文件格式,这将是一个很大的帮助。

+2

你可以将该输入文件转换为JSON或YAML或更常规的任何东西吗?即使CSV也会提高。 – tadman

+0

@tadman:是的,我可以。从任何文件格式转换都将有所帮助。 – TheMightyNight

+0

@tadman是完全正确的。请检查我的答案,以演示如何通过一个实例来做到这一点。 – Shaunak

回答

5

如果像你说的你可以控制创建原始数据文件,那么以json格式创建它将使访问它变得微不足道。

这是repl.it of complete working example。只需选择main.rb文件并点击运行!

例如,如果你创建了JSON文件:

data.json

{ 
    "cefcFRUPowerOperStatus": { 
    "type": "PowerOperType", 
    "status": { 
     "1": "offEnvOther", 
     "2": "on", 
     "3": "offAdmin", 
     "4": "offDenied", 
     "5": "offEnvPower", 
     "6": "offEnvTemp" 
    } 
    }, 
    "cefcModuleOperStatus": { 
    "type": "ModuleOperType", 
    "status": { 
     "1": "unknown", 
     "2": "ok", 
     "3": "disabled", 
     "4": "okButDiagFailed", 
     "5": "boot", 
     "6": "selfTest" 
    } 
    } 
} 

然后分析它和红宝石访问它是那样简单:

require 'json' 
file = File.read('data.json') 
data = JSON.parse(file) 

#accessing this data is simple now: 

puts data["cefcModuleOperStatus"]["status"]["4"] 
# > okButDiagFailed 

注意:这个JSON格式将w ork如果你的状态是独特的。如果他们不是,你仍然可以使用这种方式,但你需要将JSON转换为数组格式。让我知道如果是这种情况,我可以告诉你如何修改这个json和ruby代码。

希望有帮助,让我知道如果你有关于如何工作的进一步问题。