in reply to Re^2: problems parsing CSV
in thread problems parsing CSV

I refactored your script. Most of the changes I made are ones recommended in Perl Best Practices by Damian Conway. The revised script is untested and intended merely to suggest coding improvements.

#!/usr/bin/perl use strict; use warnings; use English qw( -no_match_vars ); use Text::CSV; my $release_file = '../ecodata/releases.txt'; open my $release_fh, '<', $release_file or die "Can't open release file $release_file: $OS_ERROR\n"; my $csv = Text::CSV->new({ allow_loose_quotes => 1, binary => 1, }); CSV_RECORD: while (my $csv_record = <$release_fh>) { # Skip header... next CSV_RECORD if $INPUT_LINE_NUMBER == 1; # SPECIAL CASE: Remove unwanted text... $csv_record =~ s/ \(\d{4} and after "acid aerosols" only\)//g; if (not $csv->parse($csv_record)) { my $csv_error_input = $csv->error_input(); warn "Can't parse CSV record at line $INPUT_LINE_NUMBER" . " of release file $release_file:\n$csv_error_input\n"; next CSV_RECORD; } # TRI, Release#, ChemName, RegNum, Year, Pounds, Grams my ($tri, undef, $chem_name, undef, $year, $pounds, $grams) = $csv->fields(); # [Do what you need to do with the data here] } close $release_fh; exit 0;

I moved the Text::CSV->new() constructor outside the while loop. I moved the lexical variables inside the while loop. I added a space to the beginning of the regular expression pattern matching the string being globally removed from the CSV records.