Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: I need to insert spaces and get the values for all the variables

by Random_Walk (Parson)
on Sep 04, 2013 at 08:01 UTC ( #1052245=note: print w/ replies, xml ) Need Help??


in reply to I need to insert spaces and get the values for all the variables

Then you will need to plan out the steps to achieve this. I am guessing inserting spaces is not your true aim, but graphing or outputting a graphable format is.

# open the file # Read a line at a time probably in a while loop # split the line on appropriate markers and assign the results # to a suitable data structure # look at split and hash data structures. # store the above result (print to a csv perhaps) # or plot the graph points, continue to the next line # close the file when done.

Cheers,
R.

Pereant, qui ante nos nostra dixerunt!


Comment on Re: I need to insert spaces and get the values for all the variables
Download Code
Re^2: I need to insert spaces and get the values for all the variables
by rahulruns (Beadle) on Sep 04, 2013 at 08:11 UTC

    Hi the point I am not able to get is to how to separate the data for the variables If the line is dvgqu="0.00"vgrq="0.00"w="0.00"devce="d"elped_me="174" how do I read it like dvgqu="0.00" vgrq="0.00" w="0.00" devce="d" elped_me="174" This would help in reading all the variables and their values. Without a proper separation I am not able to make out a pattern to match or to use for split

      my %vars = split /=?"/, $line;

      This splits on any " optionally preceded by the = sign.

      Update

      use strict; use warnings; use Data::Dumper; my @store; # put the results in here while (<DATA>) { chomp; next unless /\S+/; # Ignore empty lines my %vars = split /=?"/; # Do the splits push @store, \%vars; # record these samples } print Dumper \@store; # Look what we got __DATA__ dvgqu="0"vgrq="0"w="0"devce="db"elped_me="0"r="0"rmb="0"rrqm="0"vcm="0 +"ul="0"w="0"wmb="0"wrqm="0" dvgqu="0"vgrq="0"w="0"devce="d"elped_me="0"r="0"rmb="0"rrqm="0"vcm="0" +ul="0"w="0"wmb="0"wrqm="0" dvgqu="0.00"vgrq="0.00"w="0.00"devce="db"elped_me="1"r="0.00"rmb="0.00 +"rrqm="0.00"vcm="0.00"ul="0.00"w="0.00"wmb="0.00"wrqm="0.00" dvgqu="0.00"vgrq="58.91"w="0.09"devce="d"elped_me="1"r="0.00"rmb="0.00 +"rrqm="0.00"vcm="0.09"ul="0.05"w="5.50"wmb="324.00"wrqm="35.00"

      Update 2

      I just saw the variable name 'w' appears twice in the lines. In this case my code only keeps the last value. You may need to do something a little more complicated

      Cheers,
      R.

      Pereant, qui ante nos nostra dixerunt!

        Your suggestion to split on " inspired me to use it as the record separator like this:

        use strict; use warnings; use Data::Dumper; my %variables; my ($var,$val); local $/='"'; # thanks to Random_Walk while(<DATA>){ chomp; if( /=/ ) { s/[\n=]//g; # cleanup $var = $_; } else { push @{ $variables{$var} }, $_; } } print Dumper \%variables; __DATA__ dvgqu="0"vgrq="0"w="0"devce="db"elped_me="0"r="0"rmb="0"rrqm="0"vcm="0 +"ul="0"w="0"wmb="0"wrqm="0" dvgqu="0"vgrq="0"w="0"devce="d"elped_me="0"r="0"rmb="0"rrqm="0"vcm="0" +ul="0"w="0"wmb="0"wrqm="0" dvgqu="0.00"vgrq="0.00"w="0.00"devce="db"elped_me="1"r="0.00"rmb="0.00 +"rrqm="0.00"vcm="0.00"ul="0.00"w="0.00"wmb="0.00"wrqm="0.00" dvgqu="0.00"vgrq="58.91"w="0.09"devce="d"elped_me="1"r="0.00"rmb="0.00 +"rrqm="0.00"vcm="0.09"ul="0.05"w="5.50"wmb="324.00"wrqm="35.00"

        I find this solution to be very nice and elegant, probably because I would never have thought of it :).

        I'm sure there's a module somewhere out there that allows you to merge several hashes into a hash of arrays, which may be a more convenient structure depending on what you want to do with it.

        Here is another way to get those values in a AoH without the multiple m problem :

        use strict; use warnings; use Data::Dumper; my %store; # put the results in here while (<DATA>) { while(m< (\w+) = "((?:[^"\\]|\\.)+)" >gx) { # $store{$1} ||= []; ## useless: see hdb's answer below push @{ $store{$1} }, $2; # or push @array, {$. => $2} if you +want to keep track of the line of definition } } print Dumper \%store; # Look what we got __DATA__ dvgqu="0"vgrq="0"w="0"devce="db"elped_me="0"r="0"rmb="0"rrqm="0"vcm="0 +"ul="0"w="0"wmb="0"wrqm="0" dvgqu="0.00"vgrq="58.91"w="0.09"devce="d"elped_me="1"r="0.00"rmb="0.00 +"rrqm="0.00"vcm="0.09"ul="0.05"w="5.50"wmb="324.00"wrqm="35.00"
        $VAR1 = { 'ul' => [ '0', '0.05' ], 'w' => [ '0', '0', '0.09', '5.50' ], 'vgrq' => [ '0', '58.91' ], 'r' => [ '0', '0.00' ], 'rrqm' => [ '0', '0.00' ], 'elped_me' => [ '0', '1' ], 'devce' => [ 'db', 'd' ], 'dvgqu' => [ '0', '0.00' ], 'wrqm' => [ '0', '35.00' ], 'rmb' => [ '0', '0.00' ], 'vcm' => [ '0', '0.09' ], 'wmb' => [ '0', '324.00' ] };

      Try something like this

      while(<DATA>){ print join " ", /([^"=]+="[^"]+")/g; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1052245]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2015-07-05 06:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (60 votes), past polls