Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

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

by Random_Walk (Prior)
on Sep 04, 2013 at 08:01 UTC ( [id://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

Replies are listed 'Best First'.
Re^2: I need to insert spaces and get the values for all the variables
by rahulruns (Scribe) 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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1052245]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2024-04-20 01:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found