use strict; use warnings; use Text::CSV; # Field names in the order they are to appear in the CSV file my @fields = ( 'STOCK NO', 'YEAR', 'MAKE', 'CARLINE', 'COLOR DESCRIPTIONS', 'SALES CST', ); my $file = '782426.pl'; open(my $fh, '<', $file) or die "$file: $!"; my $csv = Text::CSV->new( { eol => "\n" } ); $csv->print(\*STDOUT, \@fields ); my @columns; my %columns = map { ( $_ => "" ) } @fields; while ( <$fh> ) { chomp; next unless( m/^([^\.]+)\.+\s+(.*)/ ); if($1 eq $fields[0]) { write_columns(\%columns); reset_columns(\%columns); } die "Unknown column $1" unless(exists($columns{$1})); die "duplicate column $1" if($columns{$1}); $columns{$1} = $2; } write_columns(\%columns); close($fh); exit(0); sub write_columns { my $columns = shift; if($columns->{$fields[0]}) { $csv->print(\*STDOUT, [ map { $columns->{$_} } @fields ] ); } } sub reset_columns { my $columns = shift; %$columns = map { ( $_ => "" ) } @fields; }