Forum: Ruby Pulling values from strings

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Michael F. (Guest)
on 2009-04-14 22:59
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

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
            # 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})/)

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

Robert D. (Guest)
on 2009-04-14 23:52
(Received via mailing list)
On Tue, Apr 14, 2009 at 8:59 PM, Michael Furmaniuk
<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]]

> Thanks
> --
> Posted via

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.
Joel VanderWerf (Guest)
on 2009-04-15 00:42
(Received via mailing list)
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.each {|key,val| puts "#{key} = #{val}"}

# ==>
# ScriptName = changeTests
# Pass = 15
# Fail = 0
# Total = 15
Robert D. (Guest)
on 2009-04-15 15:27
(Received via mailing list)
Seems I used only the second best tool for the job ;).
Michael F. (Guest)
on 2009-04-15 16:46
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!
This topic is locked and can not be replied to.