Data-Frame
view release on metacpan or search on metacpan
lib/Data/Frame/IO/CSV.pm view on Meta::CPAN
package Data::Frame::IO::CSV;
$Data::Frame::IO::CSV::VERSION = '0.006005';
# ABSTRACT: Partial class for data frame's conversion from/to CSV
use Data::Frame::Role;
use namespace::autoclean;
use PDL::Core qw(pdl null);
use PDL::Primitive ();
use PDL::Factor ();
use PDL::SV ();
use PDL::DateTime ();
use PDL::Types ();
use List::AllUtils qw(uniq);
use Package::Stash;
use Ref::Util qw(is_plain_arrayref is_plain_hashref);
use Scalar::Util qw(openhandle looks_like_number);
use Type::Params;
use Types::Standard qw(Any ArrayRef CodeRef Enum HashRef Map Maybe Str);
use Types::PDL qw(Piddle);
use Text::CSV;
use Data::Frame::Util qw(guess_and_convert_to_pdl);
use Data::Frame::Types qw(DataType);
classmethod from_csv ($file, :$header=true, :$sep=",", :$quote='"',
:$na=[qw(NA BAD)], :$col_names=undef, :$row_names=undef,
Map[Str, DataType] :$dtype={},
:$strings_as_factors=false
) {
state $check = Type::Params::compile(
( ArrayRef [Str] )->plus_coercions( Any, sub { [$_] } ) );
($na) = $check->($na);
# TODO
my $check_name = sub {
my ($name) = @_;
return $name;
};
my $csv = Text::CSV->new(
{
binary => 1,
auto_diag => 1,
sep => $sep,
quote => $quote
}
);
my $fh = openhandle($file);
unless ($fh) {
open $fh, "<:encoding(utf8)", "$file" or die "$file: $!";
}
my @col_names;
if ( defined $col_names ) {
@col_names = $col_names->flatten;
}
else {
if ($header) {
eval {
# suppress possible warning message on parsing header
$csv->auto_diag(0);
$csv->header( $fh, { munge_column_names => 'none' } );
@col_names = $csv->column_names;
};
$csv->auto_diag(1); # restore auto_diag
if ($@) {
# rewind as first line read by $csv->header
seek( $fh, 0, 0 );
my $first_row = $csv->getline($fh);
@col_names = @$first_row;
}
}
}
( run in 3.609 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )