From: Robert Dober Date: 2009-04-15T04:51:42+09:00 Subject: Re: Pulling values from strings On Tue, Apr 14, 2009 at 8:59 PM, Michael Furmaniuk wrote: > 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 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/. > > -- 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. -- Antoine de Saint-Exupéry