If you can guarantee the order in which the keys appear, you may not have to
build a hash to hold the entire data.
Instead you can read block by block and print the result.
--
my $csno;
while (<>) {
chomp;
s/^\s+//g; s/\s+$//g; ### weed out all whitespaces
if (/^$/) {
print_line($hash);
$hash = undef;
next;
}
my ($k, $v) = split(/=/, $_, 2); ### get the kvp
$csno = $v, next if ($k =~ /csno/); ## capture csno here
$hash->{$csno}->{$k} = $v; ### Assign kvp to last known
csno
}
--
print_line is something you have to write to pretty print your output.
<img src="http://www.gnome.org/friends/banners/associate.png" alt="Become a
Friend of GNOME" border="0" />
________________________________
From: Chris Stinemetz <[email protected]>
To: [email protected]
Sent: Wednesday, December 21, 2011 6:46 AM
Subject: parsing data
Hello list,
I am having some trouble coming up with a solution for what I am
trying to accomplish.
Any advice is greatly appreciated.
A sample of the data I would like to parse is below:
I am trying to build a table like structure where the string to the
left of the "=" sign is the header and the value to the right of the
"=" is the data value. I want to make sure to account for null value
(no value to the right of the "=")
Each new group begins with >csno and ends with a new line. I am
thinking that I am going to need to create a hash and possibly
incorporated regex, but I am not real sure how to begin this task.
I am trying to obtain the following format with the input data:
*** desired output ***
csno rfpi vrp0 vrp1 trl line low high
1 1 3423000 3423000 1700000 5
1 2 3423000 3423000 1700000 5
1 3 3423000 3423000 1700000 5
*** input ***
>csno=1
rfpi=1
vrp0=3423000
vrp1=3423000
trl=1700000
line=
low=
high=5
>csno=1
rfpi=2
vrp0=3423000
vrp1=3423000
trl=1700000
line=
low=
high=5
>csno=1
rfpi=3
vrp0=3423000
vrp1=3423000
trl=1700000
line=
low=
high=5
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/