Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Adaptive parser for tab delimited text file

by choroba (Chancellor)
on Nov 01, 2012 at 12:35 UTC ( #1001816=note: print w/replies, xml ) Need Help??


in reply to Adaptive parser for tab delimited text file

This works for me. There might be some glitches in the input format not shown in the sample, though.
#!/usr/bin/perl use warnings; use strict; use Data::Dumper; <>; # Skip the first + line. my %hash; my ($cell, $cellr); while (my $header = <>) { if ($header =~ /\b/) { if ($header =~ /^CELL\s*$/) { $cell = <>; chomp $cell; next; } my @pos; my $flip; while ($header =~ /(\b|$)/g) { push @pos, $-[0] if ++$flip % 2; # Remember the p +osition where a field starts. } chomp (my $value_line = <>); if (length $header <= length $value_line) { $pos[-1] = length $value_line; # Do not clip th +e value line if longer then header. } else { $value_line .= ' ' x (length($header)); # Do not die if +the last fields are empty. } my @values; my @fields = split /\s+/, $header; for my $i (0 .. $#fields) { push @values, substr $value_line, $pos[$i], $pos[$i+1] - $ +pos[$i]; } s/^ +| +$//g for @values; if ($fields[0] eq 'CELLR') { $cellr = shift @values; shift @fields; } $hash{$cell}{$cellr}{$_} = shift @values for @fields; } } print Dumper \%hash;
Updated: Keep the whole structure in one hash.
لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1001816]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (6)
As of 2016-12-09 22:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    On a regular basis, I'm most likely to spy upon:













    Results (158 votes). Check out past polls.