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'

Возврат — «окбутдиагфаилед»

Я не знаю о Ruby и делаю это, чтобы помочь моему сверстнику. Поэтому, пожалуйста, извините, если это вопрос новичка.

Примечание. - Мне нужно создать файл, поэтому с любым форматом файла это было бы большим подспорьем.


person TheMightyNight    schedule 12.04.2017    source источник
comment
Можете ли вы преобразовать этот входной файл в JSON или YAML или что-нибудь более традиционное? Даже CSV был бы шагом вперед.   -  person tadman    schedule 12.04.2017
comment
@tadman: Да, я могу. Преобразование из любого формата файла будет полезно.   -  person TheMightyNight    schedule 12.04.2017
comment
@tadman совершенно прав. пожалуйста, проверьте мой ответ, который показывает, как это сделать, на рабочем примере.   -  person Shaunak    schedule 12.04.2017
comment
Что вы пробовали? С каким кодом у вас возникли проблемы? В чем проблема с вашим кодом? Вы получаете ошибку? Если да, то какую именно ошибку вы получаете? Отличается ли фактический результат от ожидаемого? Если да, то какой результат вы ожидаете, почему вы ожидаете именно этот результат, каков фактический результат и чем они отличаются? Отличается ли наблюдаемое поведение кода от предполагаемого поведения? Если да, каково предполагаемое поведение и почему, какое поведение вы видите и чем они отличаются? Какова спецификация предполагаемого поведения?   -  person Jörg W Mittag    schedule 12.04.2017


Ответы (1)


Если, как вы говорите, у вас есть контроль над созданием исходного файла данных, то его создание в формате json сделает доступ к нему тривиальным.

Вот repl.it полного рабочего примера. Просто выберите файл main.rb и нажмите «Выполнить»!

Например, если вы создаете файл json, например:

данные.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"
    }
  }
}

Затем разобрать его и получить к нему доступ в Ruby так же просто, как:

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

#accessing this data is simple now:

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

Примечание. этот формат JSON будет работать, если ваши статусы уникальны. Если это не так, вы все равно можете использовать этот способ, но вам нужно будет преобразовать JSON в формат массива. Дайте мне знать, если это так, и я могу показать вам, как изменить код json и ruby ​​для этого.

Надеюсь, что это поможет, дайте мне знать, если у вас есть дополнительные вопросы о том, как это работает.

person Shaunak    schedule 12.04.2017