# Pulling values from strings

**URL:** <https://www.ruby-forum.com/t/pulling-values-from-strings/165524>\
**Category:** Ruby\
**Created:** [April 14, 2009, 8:59pm UTC](https://www.ruby-forum.com/t/pulling-values-from-strings/165524 "2009-04-14T20:59:11Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mifi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7993a0/32.png) [@mifi](https://www.ruby-forum.com/u/mifi)\
**Post date:** [April 14, 2009, 8:59pm UTC](https://www.ruby-forum.com/t/pulling-values-from-strings/165524/1 "2009-04-14T20:59:11Z")

</div>

I have a string of data that I am trying to pull values from and have  
hit a roadblack since I am still getting the hang of Ruby, in Perl this  
would be easier but it seems that Ruby may be able to do this much  
simpler.

My data starts as -  
send data StartTime: 20090413 13:41:53.000 ScriptName:changeTests  
Pass:15 Fail:0 Total:15

Then I am able to regex it to something like -  
ScriptName:changeTests Pass:15 Fail:0 Total:15

The code I have is:  
if line =~ /data/  
# Remove everything from the beginning up to ScriptName  
line.sub!(/^send.\*\d\d\d\s/,"")  
# Split the line by space, then get pairs by :  
arr = line.split(/\s/).map do |i|  
t = i.sub(/[a-zA-Z]+:([a-zA-Z]+|\d{2,3})/)  
end  
end

After the arr = line.split I am not sure what to do, I was playing  
around with various ways of pulling the data out but I am not totally  
clear on Ruby data structures. What I would like to do is pull out all  
the values to the right of the :'s and save them for a SQL insert  
statement, this is data I would like to store in a database after  
pulling out the values I need. Is it easier to use map to be able to  
iterate through the values, or can I actually split the data line so  
that I can end up with each combined value sort of acting like a hash  
key? I’d appreciate some hints on what might be a good next step so  
that after arr I should be able to have values like:  
ScriptName = changeTests  
Pass = 15  
Fail = 0  
Total = 15

Thanks

---

<div class="post-metadata">

**Author:** ![mifi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7993a0/32.png) [@mifi](https://www.ruby-forum.com/u/mifi)\
**Post date:** [April 14, 2009, 9:52pm UTC](https://www.ruby-forum.com/t/pulling-values-from-strings/165524/2 "2009-04-14T21:52:12Z")

</div>

On Tue, Apr 14, 2009 at 8:59 PM, Michael Furmaniuk  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ScriptName:changeTests Pass:15 Fail:0 Total:15
> 
> ScriptName = changeTests  
> Pass = 15  
> Fail = 0  
> Total = 15  
> Not tested but maybe you can fix errors 😉

x.split(/\s\*(\w+):\s\*/)[-8…-1].each\_cons(2).map{ |k,v| “#{k} = #{v}” }

which gives you data like

[“ScriptName = changeTests”, “changeTests = Pass”, “Pass = 15”, “15 =  
Fail”, “Fail = 0”, “0 = Total”, “Total = 15”]

which if printed with puts gives you the output above.

Note also that instead of that you could create a Hash

Hash[_x.split(/\s_(\w+):\s\*/)[-8…-1]]

HTH  
Robert

> ## Thanks
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

–  
Si tu veux construire un bateau …  
Ne rassemble pas des hommes pour aller chercher du bois, préparer des  
outils, répartir les tâches, alléger le travail… mais enseigne aux  
gens la nostalgie de l’infini de la mer.

If you want to build a ship, don’t herd people together to collect  
wood and don’t assign them tasks and work, but rather teach them to  
long for the endless immensity of the sea.

---

<div class="post-metadata">

**Author:** ![mifi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7993a0/32.png) [@mifi](https://www.ruby-forum.com/u/mifi)\
**Post date:** [April 14, 2009, 10:42pm UTC](https://www.ruby-forum.com/t/pulling-values-from-strings/165524/3 "2009-04-14T22:42:07Z")

</div>

Robert D. wrote:

> x.split(/\s\*(\w+):\s\*/)[-8…-1].each\_cons(2).map{ |k,v| “#{k} = #{v}” }

Scan is also useful for this kind of thing…

s = “ScriptName:changeTests Pass:15 Fail:0 Total:15”  
p s.scan(/(\w+):(\S+)/)

# ==\> [[“ScriptName”, “changeTests”], [“Pass”, “15”], [“Fail”, “0”],

[“Total”, “15”]]

To deal with the full string:

s = “send data StartTime: 20090413 13:41:53.000 ScriptName:changeTests  
Pass:15 Fail:0 Total:15”  
a = s.scan(/(\w+):\s\*([\s\d:.]+|\S+)/)  
p a

# ==\> [[“StartTime”, "20090413 13:41:53.000 "], [“ScriptName”,

“changeTests”], [“Pass”, "15 "], [“Fail”, "0 "], [“Total”, “15”]]  
a.shift  
a.each {|key,val| puts “#{key} = #{val}”}

# ==\>

# ScriptName = changeTests

# Pass = 15

# Fail = 0

# Total = 15

---

<div class="post-metadata">

**Author:** ![mifi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7993a0/32.png) [@mifi](https://www.ruby-forum.com/u/mifi)\
**Post date:** [April 15, 2009, 1:27pm UTC](https://www.ruby-forum.com/t/pulling-values-from-strings/165524/4 "2009-04-15T13:27:35Z")

</div>

Seems I used only the second best tool for the job ;).  
R.

---

<div class="post-metadata">

**Author:** ![mifi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7993a0/32.png) [@mifi](https://www.ruby-forum.com/u/mifi)\
**Post date:** [April 15, 2009, 2:46pm UTC](https://www.ruby-forum.com/t/pulling-values-from-strings/165524/5 "2009-04-15T14:46:19Z")

</div>

Hmm…didn’t realize I had this many options for it all.

Thanks…of course now I have to study these so I can understand what is  
going on…ahh the learning!
