http://www.perlmonks.org?node_id=997385


in reply to Re^10: Processing CSV File
in thread Processing CSV File

Same error as before..

Use of uninitialized value $vars in chomp at create-configs.pl line 18 +, <$csvfh> line 1. Use of uninitialized value $vars in split at create-configs.pl line 19 +, <$csvfh> line 1.

Replies are listed 'Best First'.
Re^12: Processing CSV File
by Kenosis (Priest) on Oct 05, 2012 at 05:39 UTC

    OK... Instead of installing Text::CSV, you can download CSV.pm into the same directory as create-configs.pl. Here's the updated script that requires CSV.pm to parse the csv files:

    #!/usr/bin/perl # use strict; use warnings; require 'CSV.pm'; $ARGV[0] or die "Usage: $0 <filename> [<filename>] ..."; my ( $template_file_name, $templateText, %hash ) = ''; my $csv = Text::CSV->new( { binary => 1, eol => $/ } ) or die "Cannot use CSV: " . Text::CSV->error_diag(); for my $csvFile (@ARGV) { print "\nProcesing file $csvFile ...\n"; open my $csvfh, '<', $csvFile or die "Unable to open $csvFile: $!" +; # Ignore column names in first line my $columnNames = $csv->getline($csvfh); # Get vars from second line my @vars = @{ $csv->getline($csvfh) }; # Process each csv line while ( my $row = $csv->getline($csvfh) ) { my $templateFN = pop @$row; if ( $template_file_name ne $templateFN ) { $template_file_name = $templateFN; undef $templateText; } # keys: fields from second line; values: fields from csv line @hash{@vars} = @$row; $templateText //= getTemplateText($template_file_name); my $templateTextCopy = $templateText; $templateTextCopy =~ s/$_/$hash{$_}/g for keys %hash; my $ofile_name = $hash{'##rtrname##'} . '.txt'; print "Writing to file: $ofile_name\n"; open my $fh, '>', $ofile_name or die "$ofile_name: $!"; print $fh $templateTextCopy; close $fh; } close $csvfh; } print "\nDone!\n"; sub getTemplateText { my ($template_file_name) = @_; local $/; open my $fh, '<', $template_file_name or die "$template_file_name: + $!"; $templateText = <$fh>; close $fh; return $templateText; }

    This workaround saves you from installing the Text::CSV Module.

      • When using Text::CSV_XS or Text::CSV do not pass eol on parser objects when eol is withing default realms. That is all handled automatically.
      • Then "<:crnl" will not be required at all.
      • If needing CSV parsing and CSV writing, make twoCSV objects where only the writing object defines eol
      • Use auto_diag!
      # No eol and auto_diag > 1 will cause die's on error (with diagnostics +) my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 2 });

      Enjoy, Have FUN! H.Merijn

        Excellent, Tux, thank you. Appreciate you looking at this code, and will make the auto_diag change.

      I get the following error

      Can't locate Text/CSV_PP.pm in @INC (@INC contains: /Library/Perl/5.12/darwin-thread-multi-2level ....
      I did the same thing for the CSV_PP.pm, as was done for the CSV.pm.. ie downloaded the code, and created a CSV_PP.pm in the same directory..
      Though no joy there..
      Any other ideas?
      Thanks

        Yes, but it's likely you're not going to like it...

        Install Text::CSV, and use the following script:

        #!/usr/bin/perl # use strict; use warnings; use Text::CSV; $ARGV[0] or die "Usage: $0 <filename> [<filename>] ..."; my ( $template_file_name, $templateText, %hash ) = ''; my $csv = Text::CSV->new( { binary => 1, eol => $/ } ) or die "Cannot use CSV: " . Text::CSV->error_diag(); for my $csvFile (@ARGV) { print "\nProcesing file $csvFile ...\n"; open my $csvfh, '<:crlf', $csvFile or die "Unable to open $csvFile +: $!"; # Ignore column names in first line my $columnNames = $csv->getline($csvfh); # Get vars from second line my @vars = @{ $csv->getline($csvfh) }; # Process each csv line while ( my $row = $csv->getline($csvfh) ) { my $templateFN = pop @$row; if ( $template_file_name ne $templateFN ) { $template_file_name = $templateFN; undef $templateText; } # keys: fields from second line; values: fields from csv line @hash{@vars} = @$row; $templateText //= getTemplateText($template_file_name); my $templateTextCopy = $templateText; $templateTextCopy =~ s/$_/$hash{$_}/g for keys %hash; my $ofile_name = $hash{'##rtrname##'} . '.txt'; print "Writing to file: $ofile_name\n"; open my $fh, '>', $ofile_name or die "$ofile_name: $!"; print $fh $templateTextCopy; close $fh; } close $csvfh; } print "\nDone!\n"; sub getTemplateText { my ($template_file_name) = @_; local $/; open my $fh, '<', $template_file_name or die "$template_file_name: + $!"; $templateText = <$fh>; close $fh; return $templateText; }

        If you try it on one machine and it resolves the uninitialized error issue, then there's more diagnostic information to work with.