use Data::Dumper; my %kid; while () { chomp; my @line = split /,/; $kid{$line[1]}{$line[2]}{$line[3]} = { duration => $line[4], function_name => $line[5] }; } print Dumper(\%kid); __DATA__ 1,2,3,4,100,A 10,20,30,40,200,B 11,21,31,41,300,C 12,22,32,42,400,D 13,23,33,43,500,E 13,23,33,53,600,F 13,23,33,63,700,G 13,23,34,73,800,H 13,23,34,83,900,I 13,24,35,93,1000,J 13,24,36,103,1100,K