#!/usr/bin/perl
use v5.12;
use warnings;
use autodie qw( :all );
use File::BOM;
use DBI;
open my $h,'>:encoding(utf-8)','test.csv';
say $h qq<\x{FEFF}"foo","bar","baz">;
say $h qq<"1","2","3">;
say $h qq<"4","5","6">;
close $h;
my $dbh=DBI->connect('dbi:CSV:',undef,undef,{ RaiseError => 1, PrintError => 0, f_ext => '.csv'});
my $sth=$dbh->prepare('select * from test');
$sth->execute();
while (my @a=$sth->fetchrow_array()) {
say join(",",@a);
}
$sth->finish();
####
#!/usr/bin/perl
use v5.12;
use warnings;
use autodie qw( :all );
use File::BOM;
use DBI;
use Data::Dumper;
package My::Text::CSV_XS {
use parent "Text::CSV_XS";
sub DUMP
{
return Data::Dumper->new([\@_],['*_'])->Sortkeys(1)->Indent(1)->Useqq(1)->Dump();
}
sub new
{
my $proto=shift;
say "$proto -> new(",DUMP(@_),")";
$proto->SUPER::new(@_);
}
sub header
{
my $self=shift;
say "$self -> header(",DUMP(@_),")";
$self->SUPER::header(@_);
}
sub getline
{
my $self=shift;
say "$self -> getline(",DUMP(@_),")";
$self->SUPER::getline(@_);
}
sub getline_hr
{
my $self=shift;
say "$self -> getline_hr(",DUMP(@_),")";
$self->SUPER::getline_hr(@_);
}
sub getline_all
{
my $self=shift;
say "$self -> getline(",DUMP(@_),")";
$self->SUPER::getline_all(@_);
}
sub getline_hr_all
{
my $self=shift;
say "$self -> getline_hr(",DUMP(@_),")";
$self->SUPER::getline_hr_all(@_);
}
}
open my $h,'>:encoding(utf-8)','test.csv';
say $h qq<\x{FEFF}"foo","bar","baz">;
say $h qq<"1","2","3">;
say $h qq<"4","5","6">;
close $h;
my $dbh=DBI->connect('dbi:CSV:',undef,undef,{ RaiseError => 1, PrintError => 0, f_ext => '.csv', csv_class => 'My::Text::CSV_XS'});
my $sth=$dbh->prepare('select * from test');
$sth->execute();
while (my @a=$sth->fetchrow_array()) {
say join(",",@a);
}
$sth->finish();
##
##
>perl test2.pl
My::Text::CSV_XS -> new(@_ = (
{
"auto_diag" => 1,
"binary" => 1,
"escape_char" => "\"",
"quote_char" => "\"",
"sep_char" => ","
}
);
)
My::Text::CSV_XS -> new(@_ = (
{
"auto_diag" => 1,
"binary" => 1,
"eol" => "\r\n",
"escape_char" => "\"",
"quote_char" => "\"",
"sep_char" => ","
}
);
)
My::Text::CSV_XS=HASH(0x23e04e8) -> getline(@_ = (
bless( \*Symbol::GEN1, 'IO::File' )
);
)
DBD::CSV::st execute failed:
Execution ERROR: Missing first row due to EIF - Loose unescaped quote at /usr/lib64/perl5/vendor_perl/DBI/DBD/SqlEngine.pm line 1480.
.
at /usr/lib64/perl5/vendor_perl/DBI/DBD/SqlEngine.pm line 1271.
[for Statement "select * from test"] at test2.pl line 71, line 1.
>
##
##
sub apply_encoding
{
my ($self, $meta, $fn) = @_;
defined $fn or $fn = "file handle " . fileno ($meta->{fh});
if (my $enc = $meta->{f_encoding}) {
binmode $meta->{fh}, ":encoding($enc)" or
croak "Failed to set encoding layer '$enc' on $fn: $!";
}
else {
binmode $meta->{fh} or croak "Failed to set binary mode on $fn: $!";
}
} # apply_encoding
##
##
#!/usr/bin/perl
use v5.12;
use warnings;
use autodie qw( :all );
use File::BOM;
use DBI;
open my $h,'>:encoding(utf-8)','test.csv';
say $h qq<\x{FEFF}"foo","bar","baz">;
say $h qq<"1","2","3">;
say $h qq<"4","5","6">;
close $h;
my $dbh=DBI->connect(
'dbi:CSV:',
undef,
undef,
{
RaiseError => 1,
PrintError => 0,
f_ext => '.csv',
f_encoding => 'utf-8):via(File::BOM' # <-- this is the evil trick!
}
);
my $sth=$dbh->prepare('select * from test');
$sth->execute();
while (my @a=$sth->fetchrow_array()) {
say join(",",@a);
}
$sth->finish();
##
##
>perl test3.pl
1,2,3
4,5,6
>