Note: I'm new to the list. My apologies if I'm doing anything incorrectly.

 

I'm relatively new to Perl. I'm having a problem with parsing some CSV data.
I'm using  Text::CSV_XS.

 

I need to be able to process CSV files in the 2 formats in these sample
files (not with the same script).

 

FIle 1

            "My name", " is ""Joe""

            ", "Who are you?"

 

File 2

            "My name", " is \"Joe\" \n ", "Who are you?"

 

The first format uses "" for a quote inside a field, and has an embedded
newline in the 2nd field

The second format uses \" and has the character string "\n" rather than a
newline.

 

I've written a test program that reads these files with csv->getline() and
prints out the fields.

 

Using the following options

 my $csv = Text::CSV_XS->new( { binary => 1, eol => $/, allow_whitespace =>
1 } );

 

I have no problem with file 1 - output is

 

            field 0 - My name

            field 1 -  is "Joe"

 

            field 2 - Who are you?

 

but file 2 gives

 

            Error parsing file2 - last line 0

            Error: EIQ - QUO character not allowed

            Error line: "My name", " is \"Joe\" \n ", "Who are you?"

 

I've tried different sets of options and I can get file to read, but not to
parse the \n properly (I'd like it converted to an actual newline). Some of
the options I've tried and the output for file 2 are below:

 

my $csv = Text::CSV_XS->new( { binary => 1, eol => $/, allow_whitespace =>
1, allow_loose_escapes => 1, ( escape_char => "\\" ) } );

 

my $csv = Text::CSV_XS->new( { binary => 1, allow_whitespace => 1,
allow_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char => "\\" ) }
);

 

my $csv = Text::CSV_XS->new( { binary => 1, eol => $/, allow_whitespace =>
1, allow_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char => "\\" )
} );

 

These all give this output

 

            field 1 - My name

            field 2 -  is "Joe" n

            field 3 - Who are you?

 

 

my $csv = Text::CSV_XS->new( { binary => 1, allow_loose_quotes => 1,
blank_is_undef => 1, escape_char => undef } );

 

my $csv = Text::CSV_XS->new( { binary => 1, eol => $/, allow_whitespace =>
1, allow_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char => undef
) } )

 

my $csv = Text::CSV_XS->new( { binary => 1, allow_whitespace => 1,
allow_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char => undef ) }

 

These all give this output

 

            field 1 - My name

            field 2 -  " is \"Joe\" \n "

            field 3 -  "Who are you?"

 

Any help or suggestions is greatly appreciated.

John

 

Here's my test script

-----------------------------------------

#!/usr/bin/perl -w

 

use strict;

use Text::CSV_XS;

 

while ( my $file = shift @ARGV ) {

        parse_file( $file );

}

 

sub parse_file {

        my ( $href, $d, $u, $q );

        my ( $file ) = @_;

 

        # Create our CSV object

        #my $csv = Text::CSV_XS->new( { binary => 1, eol => $/,
allow_whitespace

 => 1 } );

        #my $csv = Text::CSV_XS->new( { binary => 1, eol => $/,
allow_whitespace

 => 1, allow_loose_escapes => 1, ( escape_char => "\\" ) } );

        #my $csv = Text::CSV_XS->new( { binary => 1, allow_loose_quotes =>
1, bl

ank_is_undef => 1, escape_char => undef } );

        #my $csv = Text::CSV_XS->new( { binary => 1, eol => $/,
allow_whitespace

 => 1, allow_loose_quotes => 1, escape_char=> undef } );

        #my $csv = Text::CSV_XS->new( { binary => 1, eol => $/,
allow_whitespace

 => 1, allow_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char =>
"\\" )

 } );

        #my $csv = Text::CSV_XS->new( { binary => 1, allow_whitespace => 1,
allo

w_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char => "\\" ) } );

        #my $csv = Text::CSV_XS->new( { binary => 1, eol => $/,
allow_whitespace

 => 1, allow_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char =>
undef

) } );

        my $csv = Text::CSV_XS->new( { binary => 1, allow_whitespace => 1,
allow

_loose_escapes => 1, allow_loose_quotes =>1, ( escape_char => undef ) } );

 

        my $i;

        open( LOG, $file ) || die $!;

        while ( my $row = $csv->getline( *LOG ) ) {

                for ($i = 0 ; $i <= 100 ; $i++ ) {

                        last if ( !defined $row->[$i] );

                        print "field $i - $row->[$i]\n";

                }

                print "\n";

        }

 

        if ( !$csv->eof() ) {

                print "Error parsing $file\n";

                print "Error: " . $csv->error_diag() . "\n";

                print "Error line: " . $csv->error_input() . "\n";

                exit( -1 );

        }

 

        close( LOG );

}

Reply via email to