Pulling values from strings


#1

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


#2

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 :wink:

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/.


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.


#3

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


#4

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


#5

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!