Tux / Text-CSV_XS

perl5 module for composition and decomposition of comma-separated values
17 stars 20 forks source link

csv() cannot have both in and out be filenames #10

Closed oschwald closed 7 years ago

oschwald commented 7 years ago

Currently, if both of these are file names, you get an error like:

Can't use string ("infile.csv") as an ARRAY ref while "strict refs" in use at /home/greg/perl5/perlbrew/perls/perl-5.26.0/lib/site_perl/5.26.0/x86_64-linux/Text/CSV_XS.pm line 1169.

I was trying to do something like:

 csv (
    in      => 'infile.csv',
    headers => "auto",
    on_in   => sub { $_{'domain'} =~ s/^(.+)$/${1}.com/ },
    out => 'outfile.csv',
    );
Tux commented 7 years ago

This restriction is mentioned in the documentation:

       When used with "out", "in" should be a reference to a CSV structure
       (AoA or AoH)  or a CODE-ref that returns an array-reference or a hash-
       reference.  The code-ref will be invoked with no arguments.

and this is also why there is this section in the docs:

   Rewriting CSV
       Rewrite "CSV" files with ";" as separator character to well-formed
       "CSV":

        use Text::CSV_XS qw( csv );
        csv (in => csv (in => "bad.csv", sep_char => ";"), out => *STDOUT);

       As "STDOUT" is now default in "csv", a one-liner converting a UTF-16
       CSV file with BOM and TAB-separation to valid UTF-8 CSV could be:

        $ perl -C3 -MText::CSV_XS=csv -we\
           'csv(in=>"utf16tab.csv",encoding=>"utf16",sep=>"\t")' >utf8.csv

To enable your case is much harder than it might look, as it will break a lot of other supported work-flows. I already tried. One of the problems you might run into is on Windows dealing with EOL issues.

Tux commented 7 years ago

I have now committed a change that croaks showing the supported syntax

$ perl -Mblib -MText::CSV_XS=csv -we'csv (in => "in.csv", headers => "auto", out => "out.csv")'
Cannot use a string for both in and out. Instead use:
 csv (in => csv (in => "in.csv"), out => "out.csv");
 at -e line 1.
oschwald commented 7 years ago

Thanks. That sounds like an improvement.