NAME

FP::Text::CSV - functional interface to Text::CSV

SYNOPSIS

use FP::Text::CSV qw(csv_line_xparser
                     csv_fh_to_rows
                     csv_file_to_rows
                     rows_to_csv_fh
                     rows_to_csv_file);

my $csvparams = +{sep_char => ";", eol => "\n"};
# $csvparams and any of its entries are optional,
#  defaults are taken from $FP::Text::CSV::defaults

use Chj::xopen qw(xopen_read xopen_write);
use FP::List; use FP::Stream; use FP::Equal 'is_equal';
mkdir ".tmp";

# -- Output: ---
my $rows =
  cons [ "i", "i^2" ],
    stream_iota->map(sub {
        my ($i) = @_;
        [ $i, $i*$i ]
    })->take(100);
rows_to_csv_fh (Keep($rows), xopen_write(".tmp/a1.csv"),
                $csvparams);
# or
rows_to_csv_file ($rows, ".tmp/a2.csv", $csvparams);


# -- Input: ---
my $p = csv_line_xparser $csvparams;
my @vals = &$p("1;2;3;4\n");
is_equal \@vals, [1,2,3,4];

my $itemstream1 =
        csv_fh_to_rows(xopen_read(".tmp/a1.csv"), $csvparams);
# or
my $itemstream2 = csv_file_to_rows(".tmp/a2.csv", $csvparams);

is_equal $itemstream1, $itemstream2;
is_equal $itemstream2->first, [ "i", "i^2" ];
is_equal $itemstream2->second, [ 0, 0 ];
is_equal $itemstream2->ref(10), [ 9, 81 ];

DESCRIPTION

Handle CSV input and output in the form of functional streams (lazily computed linked lists).

NOTE

Text::CSV added a 'csv' export somewhat recently. Together with FP::autobox that can make for a nice solution (although not lazy), too.

This is alpha software! Read the status section in the package README or on the website.