Created
October 23, 2010 17:56
-
-
Save mfontani/642494 to your computer and use it in GitHub Desktop.
Answer on SO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use strict; | |
use warnings; | |
# Column details and sample line, from the post | |
my $header = q{0 AOZSVIN, TAMSSZ B A A- B+ B B- C+ C C- D+ D D- F CR P PR I I* W WP WF AU NR FN FS}; | |
my $sample = q{0 AAS 150 23 25 16 35 45 14 8 10 2 1 1 4 4 }; | |
# -+--------+-----+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---.. | |
# chars 1212345678912345612345612341234123412341234123412341234123412341234123412341234123412341234123412341234123412341234... | |
# num. chars: 2 9 6 6 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 * | |
my $unpack = q{A2A9 A6 A6 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A*}; | |
$unpack =~ s/\s//g; | |
# Get column names from the "$header" variable above | |
my @column_names = unpack($unpack, $header); | |
s/\s+$// for @column_names; # get rid of trailing spaces | |
s/^\s+// for @column_names; # get rid of leading spaces | |
# Some sample data in same format, to try the script out | |
my @samples = ( | |
q{0 AAS 150 23 25 16 35 45 14 8 10 2 1 1 4 4 }, | |
q{0 AAS 353 2 3 5 2 6 1 2 }, | |
q{0 T304 480M 3 10 8 8 2 3 2 1 1 1 }, | |
q{0 BIOS 206 3 14 5 11 9 8 4 8 3 1 1 6 7 }, | |
); | |
my @big_sample = (@samples) ;#x 200_000; | |
my @unpacked_data_as_arrayrefs; | |
my @unpacked_data_as_hashrefs; | |
my $begin = time; | |
for my $line ( @big_sample ) { | |
my @data = unpack($unpack,$line); | |
s/\s+$// for @data; # get rid of trailing spaces | |
s/^\s+// for @data; # get rid of leading spaces | |
push @unpacked_data_as_arrayrefs, [@data]; # stop here if this is all you need | |
## below converts the data in a hash, based on the column names given | |
#my %as_hash; | |
#for ( 0..$#column_names ) { | |
# $as_hash{ $column_names[$_] } = $data[$_]; | |
#} | |
#push @unpacked_data_as_hashrefs, { %as_hash }; | |
} | |
my $tot = time - $begin; | |
print "Done in $tot seconds\n"; | |
# verify all data is as we expected | |
# uncomment the ones that test hashref, if the above hashref-building code is also uncommented. | |
{ | |
use Test::More; | |
# first sample | |
is($unpacked_data_as_arrayrefs[0]->[2],'AAS'); # AAS in the third column | |
is($unpacked_data_as_arrayrefs[0]->[7],'35'); # 35 in the 8th column | |
# fourth sample | |
is($unpacked_data_as_arrayrefs[3]->[2],'BIOS'); | |
is($unpacked_data_as_arrayrefs[3]->[15],'6'); | |
# sixth | |
is($unpacked_data_as_arrayrefs[5]->[7],'114'); | |
is($unpacked_data_as_arrayrefs[5]->[10],'75'); | |
done_testing(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment