2014-05-02 59 views
2

我有場景,因爲我在abc file中存儲了一個哈希值。從ruby中的文件檢索哈希

這裏是我的ABC文件

{ 
    "access_key"=>"XXXXXXXXXXXXXXXXXXX", 
    "secret_access_key"=>"XXXXXXXXXXXXXXXXXXX", 
    "bucket"=>"XXXXXXXXXXXXXXXXXXX", 
    "name_prefix"=>"my_videos/178/4406/", 
    "x-amz-security-token"=>"AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
    "expires"=>1999196123 
} 

現在我要檢索哈希值。以便我可以讀取文件並獲得值access_key,name_prefix

我該如何在ruby中做到這一點?

回答

2

不要像這樣存儲它。在YAML文件中存儲它:

access_key: XXXXXXXXXXXXXXXXXXX 
secret_access_key: XXXXXXXXXXXXXXXXXXX 
bucket: XXXXXXXXXXXXXXXXXXX 
name_prefix: my_videos/178/4406/ 
x-amz-security-token: AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF73fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC/UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3f/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEjDmuxfXIM3mjZsF 
expires: 1999196123 

然後只是加載:

my_hash = YAML.load File.open('/path/to/yaml/file') 

my_hash['access_key']  #=> 'XXXXXXXXXXXXXXXX' 
3

Ruby的Hash.to_s不是雙向序列化,所以格式不能輕易反序列化。

如果在文件中的數據是足夠的可預測的,你可以將文件內容轉換爲更JSON樣格式,然後反序列化:

require 'json' 

values = JSON.parse(file_contents.gsub("=>", ": ")) 

values['access_key'] 
# => "access_key"=>"XXXXXXXXXXXXXXXXXXX" 
values['name_prefix'] 
# => "my_videos/178/4406/" 

如果你有你的文件是如何寫的控制,我會建議你不要使用Hash.to_s,而是hash.to_json寫入文件:

puts values.to_json 
#=> { 
#=>  "access_key": "XXXXXXXXXXXXXXXXXXX", 
#=>  "secret_access_key": "XXXXXXXXXXXXXXXXXXX", 
#=>  "bucket": "XXXXXXXXXXXXXXXXXXX", 
#=>  "name_prefix": "my_videos/178/4406/", 
#=>  "x-amz-security-token": "AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
#=>  "expires": 1999196123 
#=> } 

這將允許你跳過代碼中的gsub以上,並且是很多比目前的狀況更穩健。

3

使用eval

file.txt的

{ 
    "access_key"=>"XXXXXXXXXXXXXXXXXXX", 
    "secret_access_key"=>"XXXXXXXXXXXXXXXXXXX", 
    "bucket"=>"XXXXXXXXXXXXXXXXXXX", 
    "name_prefix"=>"my_videos/178/4406/", 
    "x-amz-security-token"=>"AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
    "expires"=>1999196123 
} 

代碼:

my_hash = eval(File.read('file.txt')) 
=> {"access_key"=>"XXXXXXXXXXXXXXXXXXX", 
"secret_access_key"=>"XXXXXXXXXXXXXXXXXXX", 
"bucket"=>"XXXXXXXXXXXXXXXXXXX", 
"name_prefix"=>"my_videos/178/4406/", 
"x-amz-security-token"=> 
    "AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
"expires"=>1999196123} 

雖然,這只是您的情況的解決方法。我建議您使用固定數據格式,如JSONYAML將數據保存在文件中,然後將其取回到代碼中。

+0

犯錯。請解釋downvote的原因。我確實理解'eval'的安全問題,我在回答中解決了這個問題。這只是爲OP的條件解決方法。 – kiddorails