Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Re: Low-threshold function in Text::CSV_XS

by Tux (Abbot)
on Feb 06, 2014 at 08:44 UTC ( #1073668=note: print w/replies, xml ) Need Help??

in reply to Low-threshold function in Text::CSV_XS

I have just uploaded Text-CSV_XS-1.04, which has defined the new functionality like this:


This function is not exported by default and should be explicitly requested:

 use Text::CSV_XS qw( csv );

This is the first draft. This function will stay, but the arguments might change based on user feedback: esp. the headers attribute is not complete. The basics will stay.

This is an high-level function that aims at simple interfaces. It can be used to read/parse a CSV file or stream (the default behavior) or to produce a file or write to a stream (define the out attribute). It returns an array reference on parsing (or undef on fail) or the numeric value of "error_diag" on writing. When this function fails you can get to the error using the class call to "error_diag"

my $aoa = csv (in => "test.csv") or die Text::CSV_XS->error_diag;

This function takes the arguments as key-value pairs. It can be passed as a list or as an anonymous hash:

my $aoa = csv ( in => "test.csv", sep_char => ";"); my $aoh = csv ({ in => $fh, headers => "auto" });

The arguments passed consist of two parts: the arguments to "csv" itself and the optional attributes to the CSV object used inside the function as enumerated and explained in "new".

If not overridden, the default options used for CSV are

 auto_diag => 1

These options are always set and cannot be altered

 binary    => 1


Used to specify the source. in can be a file name (e.g. "file.csv"), which will be opened for reading and closed when finished, a file handle (e.g. $fh or FH), a reference to a glob (e.g. \*ARGV), or - when your version of perl is not archaic - the glob itself (e.g. *STDIN).

When used with "out", it should be a reference to a CSV structure (AoA or AoH).

my $aoa = csv (in => "file.csv"); open my $fh, "<", "file.csv"; my $aoa = csv (in => $fh); my $csv = [ [qw( Foo Bar )], [ 1, 2 ], [ 2, 3 ]]; my $err = csv (in => $csv, out => "file.csv");


In output mode, the default CSV options when producing CSV are

 eol       => "\r\n"

The "fragment" attribute is ignored in output mode.

out can be a file name (e.g. "file.csv"), which will be opened for writing and closed when finished, a file handle (e.g. $fh or FH), a reference to a glob (e.g. \*STDOUT), or - when your version of perl is not archaic - the glob itself (e.g. *STDOUT).


If passed, it should be an encoding accepted by the :encoding() option to open. There is no default value. This attribute does not work in perl 5.6.x.


If this attribute is not given, the default behavior is to produce an array of arrays.

If headers is given, it should be either an anonymous list of column names or a flag: auto or skip. When skip is used, the header will not be included in the output.

 my $aoa = csv (in => $fh, headers => "skip");

If auto is used, the first line of the CSV source will be read as the list of field headers and used to produce an array of hashes.

 my $aoh = csv (in => $fh, headers => "auto");

If headers is an anonymous list, it will be used instead

my $aoh = csv (in => $fh, headers => [qw( Foo Bar )]); csv (in => $aoa, out => $fh, headers => [qw( code description price } +]);


Only output the fragment as defined in the "fragment" method. This attribute is ignored when generating CSV. See "out".

Combining all of them could give something like

use Text::CSV_XS qw( csv ); my $aoh = csv ( in => "test.txt", encoding => "utf-8", headers => "auto", sep_char => "|", fragment => "row=3;6-9;15-*", ); say $aoh->[15]{Foo};

Thanks for all the feedback I got!

Enjoy, Have FUN! H.Merijn

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1073668]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (8)
As of 2018-05-28 08:52 GMT
Find Nodes?
    Voting Booth?