use Data::Dumper; use strict; use warnings; open DATA, "<", "foo.dat"; my $data = {}; while (my $line = ) { my @columns = split /,/, $line; push @{$data->{$columns[0]}}, [$columns[1], $columns[2]]; } close DATA; print Dumper($data); #### $VAR1 = { 'AH2S21003' => [ [ '2004-01-16 02:23:05.000000', 'ANE4987E Error processing ' ], [ '2004-01-16 02:24:05.000000', 'ANE4987E Error processing ' ], [ '2004-01-16 02:24:05.000000', 'ANE4987E Error processing ' ] ], 'AH2D21001' => [ [ '2004-01-15 22:57:32.000000', 'ANE4987E Error processing ' ], [ '2004-01-15 22:57:33.000000', 'ANE4987E Error processing ' ], [ '2004-01-15 22:57:34.000000', 'ANE4987E Error processing ' ] ], 'ESI2A55P' => [ [ '2004-01-16 04:21:43.000000', 'ANE4037E File Skipped ' ], [ '2004-01-16 04:25:43.000000', 'ANE4037E File Skipped ' ], [ '2004-01-16 04:27:43.000000', 'ANE4037E File Skipped' ] ], 'ABHS00001' => [ [ '2004-01-16 01:43:24.000000', 'ANE4987E Error processing ' ], [ '2004-01-16 01:46:24.000000', 'ANE4987E Error processing ' ], [ '2004-01-16 01:49:24.000000', 'ANE4987E Error processing ' ] ] };