Question

I have scenario as, I have stored a hash value in the abc file.

Here is my abc file

{
    "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
}

now I have to retrieve that hash. So that I can read the file and get value of access_key, name_prefix.

How can I do this in ruby?

Was it helpful?

Solution 3

Do not store it like this. Store it in a yaml file:

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

And then just load it with:

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

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

OTHER TIPS

Use 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
}

Code:

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}

Though, this is just a workaround for your condition. I will recommend you to use fixed data formats like JSON or YAML to persist data in files and then fetch it back in your code.

Ruby's Hash.to_s is not a two-way serialization, so the format cannot be readily de-serialized.

If the data in file is predictable enough, you can convert the file contents to a more JSON-like format, and then deserialize it:

require 'json'

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

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

If you have control on how your file is written, I will suggest that you do not use Hash.to_s, but rather hash.to_json to write your file:

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
#=> }

This will allow you to skip the gsub in the code above, and is a lot more robust than the current situation.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top