Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-Text-CSV_XS for
openSUSE:Factory checked in at 2023-12-02 17:12:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Text-CSV_XS (Old)
and /work/SRC/openSUSE:Factory/.perl-Text-CSV_XS.new.25432 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Text-CSV_XS"
Sat Dec 2 17:12:47 2023 rev:52 rq:1130244 version:1.530.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Text-CSV_XS/perl-Text-CSV_XS.changes
2023-09-29 21:13:59.694660154 +0200
+++
/work/SRC/openSUSE:Factory/.perl-Text-CSV_XS.new.25432/perl-Text-CSV_XS.changes
2023-12-02 17:12:58.880926539 +0100
@@ -1,0 +2,13 @@
+Fri Nov 24 03:08:00 UTC 2023 - Tina Müller <[email protected]>
+
+- updated to 1.53
+ see /usr/share/doc/packages/perl-Text-CSV_XS/ChangeLog
+
+ 1.53 - 2023-11-22, H.Merijn Brand
+ * Two casts for -Wformat (issue 50)
+ * Add --skip-empty to csv2xlsx
+ * Add --font and --font-size to csv2xlsx
+ * Fix skip_empty_rows ("skip") and trailing newlines (Corey Hickey,
PR#52)
+ * Fix comment in last line (RT#150501)
+
+-------------------------------------------------------------------
Old:
----
Text-CSV_XS-1.52.tgz
New:
----
Text-CSV_XS-1.53.tgz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Text-CSV_XS.spec ++++++
--- /var/tmp/diff_new_pack.uqnkej/_old 2023-12-02 17:12:59.540950726 +0100
+++ /var/tmp/diff_new_pack.uqnkej/_new 2023-12-02 17:12:59.540950726 +0100
@@ -18,9 +18,9 @@
%define cpan_name Text-CSV_XS
Name: perl-Text-CSV_XS
-Version: 1.520.0
+Version: 1.530.0
Release: 0
-%define cpan_version 1.52
+%define cpan_version 1.53
License: Artistic-1.0 OR GPL-1.0-or-later
Summary: Comma-Separated Values manipulation routines
URL: https://metacpan.org/release/%{cpan_name}
@@ -28,9 +28,9 @@
Source1: cpanspec.yml
BuildRequires: perl
BuildRequires: perl-macros
-Provides: perl(Text::CSV_XS) = 1.520.0
+Provides: perl(Text::CSV_XS) = %{version}
%define __perllib_provides /bin/true
-Recommends: perl(Encode) >= 3.19
+Recommends: perl(Encode) >= 3.200.0
%{perl_requires}
%description
++++++ Text-CSV_XS-1.52.tgz -> Text-CSV_XS-1.53.tgz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/CSV_XS.pm
new/Text-CSV_XS-1.53/CSV_XS.pm
--- old/Text-CSV_XS-1.52/CSV_XS.pm 2023-09-20 18:28:07.000000000 +0200
+++ new/Text-CSV_XS-1.53/CSV_XS.pm 2023-09-22 10:29:41.000000000 +0200
@@ -23,7 +23,7 @@
use Carp;
use vars qw( $VERSION @ISA @EXPORT_OK %EXPORT_TAGS );
-$VERSION = "1.52";
+$VERSION = "1.53";
@ISA = qw( Exporter );
XSLoader::load ("Text::CSV_XS", $VERSION);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/CSV_XS.xs
new/Text-CSV_XS-1.53/CSV_XS.xs
--- old/Text-CSV_XS-1.52/CSV_XS.xs 2023-09-21 09:08:32.000000000 +0200
+++ new/Text-CSV_XS-1.53/CSV_XS.xs 2023-11-20 18:35:19.000000000 +0100
@@ -614,7 +614,7 @@
_cache_show_str ("tmp", (int)strlen (s), (byte *)s);
}
if (csv->cache)
- warn (" %-20s %4d:0x%08x\n", "cache", sizeof (csv_t), csv->cache);
+ warn (" %-20s %4d:0x%08lx\n", "cache", (int)sizeof (csv_t), (unsigned
long)csv->cache);
else
warn (" %-22s --:no cache yet\n", "cache");
} /* _csv_diag */
@@ -974,7 +974,7 @@
if (c == EOF || ser == 2) { \
sv_free (sv); \
sv = NULL; \
- waitingForField = 0; \
+ seenSomething = FALSE;
\
if (ser == 2) return FALSE; \
break; \
} \
@@ -1423,16 +1423,16 @@
#endif
#if MAINT_DEBUG > 1
+static char _sep[64];
static char *_sep_string (csv_t *csv) {
- char sep[64];
if (csv->sep_len) {
int x;
for (x = 0; x < csv->sep_len; x++)
- (void)sprintf (sep + x * x, "%02x ", csv->sep[x]);
+ (void)sprintf (_sep + x * x, "%02x ", csv->sep[x]);
}
else
- (void)sprintf (sep, "'%c' (0x%02x)", CH_SEP, CH_SEP);
- return sep;
+ (void)sprintf (_sep, "'%c' (0x%02x)", CH_SEP, CH_SEP);
+ return _sep;
} /* _sep_string */
#endif
@@ -1998,9 +1998,12 @@
csv->used = csv->size;
csv->fld_idx = 0;
c = CSV_GET;
+ seenSomething = FALSE;
#if MAINT_DEBUG > 5
(void)fprintf (stderr, "# COMMENT, SKIPPED\n");
#endif
+ if (c == EOF)
+ break;
goto restart;
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/ChangeLog
new/Text-CSV_XS-1.53/ChangeLog
--- old/Text-CSV_XS-1.52/ChangeLog 2023-09-21 09:59:52.000000000 +0200
+++ new/Text-CSV_XS-1.53/ChangeLog 2023-11-22 20:30:12.000000000 +0100
@@ -1,3 +1,10 @@
+1.53 - 2023-11-22, H.Merijn Brand
+ * Two casts for -Wformat (issue 50)
+ * Add --skip-empty to csv2xlsx
+ * Add --font and --font-size to csv2xlsx
+ * Fix skip_empty_rows ("skip") and trailing newlines (Corey Hickey, PR#52)
+ * Fix comment in last line (RT#150501)
+
1.52 - 2023-09-21, H.Merijn Brand
* Fix possible coredump in cache on non-IO parse (issue 49)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/META.json
new/Text-CSV_XS-1.53/META.json
--- old/Text-CSV_XS-1.52/META.json 2023-09-21 13:20:30.000000000 +0200
+++ new/Text-CSV_XS-1.53/META.json 2023-11-23 10:19:13.000000000 +0100
@@ -1,70 +1,70 @@
{
- "resources" : {
- "license" : [
- "http://dev.perl.org/licenses/"
- ],
- "bugtracker" : {
- "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Text-CSV_XS"
- },
- "homepage" : "https://metacpan.org/pod/Text::CSV_XS",
- "x_IRC" : "irc://irc.perl.org/#csv",
- "repository" : {
- "web" : "https://github.com/Tux/Text-CSV_XS",
- "url" : "https://github.com/Tux/Text-CSV_XS",
- "type" : "git"
- }
- },
- "author" : [
- "H.Merijn Brand <hmbrand.org>"
- ],
- "license" : [
- "perl_5"
- ],
- "name" : "Text-CSV_XS",
- "meta-spec" : {
- "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
- "version" : 2
- },
"release_status" : "stable",
"prereqs" : {
- "runtime" : {
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "0"
+ },
"recommends" : {
- "Encode" : "3.19"
+ "ExtUtils::MakeMaker" : "7.70"
+ }
},
+ "runtime" : {
+ "recommends" : {
+ "Encode" : "3.20"
+ },
"requires" : {
"IO::Handle" : "0",
"perl" : "5.006001",
"XSLoader" : "0"
- }
- },
+ }
+ },
"test" : {
"requires" : {
"Tie::Scalar" : "0",
"Test::More" : "0"
- }
- },
+ }
+ },
"build" : {
"requires" : {
"Config" : "0"
+ }
}
},
- "configure" : {
- "requires" : {
- "ExtUtils::MakeMaker" : "0"
+ "resources" : {
+ "homepage" : "https://metacpan.org/pod/Text::CSV_XS",
+ "bugtracker" : {
+ "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Text-CSV_XS"
},
- "recommends" : {
- "ExtUtils::MakeMaker" : "7.70"
- }
- }
- },
- "generated_by" : "Author",
- "abstract" : "Comma-Separated Values manipulation routines",
+ "license" : [
+ "http://dev.perl.org/licenses/"
+ ],
+ "repository" : {
+ "url" : "https://github.com/Tux/Text-CSV_XS",
+ "type" : "git",
+ "web" : "https://github.com/Tux/Text-CSV_XS"
+ },
+ "x_IRC" : "irc://irc.perl.org/#csv"
+ },
+ "name" : "Text-CSV_XS",
"provides" : {
"Text::CSV_XS" : {
- "file" : "CSV_XS.pm",
- "version" : "1.52"
- }
- },
+ "version" : "1.53",
+ "file" : "CSV_XS.pm"
+ }
+ },
+ "abstract" : "Comma-Separated Values manipulation routines",
+ "license" : [
+ "perl_5"
+ ],
+ "author" : [
+ "H.Merijn Brand <[email protected]>"
+ ],
+ "version" : "1.53",
+ "generated_by" : "Author",
"dynamic_config" : 1,
- "version" : "1.52"
-}
+ "meta-spec" : {
+ "version" : 2,
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec"
+ }
+ }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/META.yml
new/Text-CSV_XS-1.53/META.yml
--- old/Text-CSV_XS-1.52/META.yml 2023-09-21 13:20:30.000000000 +0200
+++ new/Text-CSV_XS-1.53/META.yml 2023-11-23 10:19:13.000000000 +0100
@@ -1,7 +1,7 @@
---
abstract: Comma-Separated Values manipulation routines
author:
- - H.Merijn Brand <hmbrand.org>
+ - H.Merijn Brand <[email protected]>
build_requires:
Config: 0
configure_requires:
@@ -16,9 +16,9 @@
provides:
Text::CSV_XS:
file: CSV_XS.pm
- version: '1.52'
+ version: '1.53'
recommends:
- Encode: '3.19'
+ Encode: '3.20'
requires:
IO::Handle: 0
Test::More: 0
@@ -31,4 +31,4 @@
homepage: https://metacpan.org/pod/Text::CSV_XS
license: http://dev.perl.org/licenses/
repository: https://github.com/Tux/Text-CSV_XS
-version: '1.52'
+version: '1.53'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/Makefile.PL
new/Text-CSV_XS-1.53/Makefile.PL
--- old/Text-CSV_XS-1.52/Makefile.PL 2023-01-03 13:18:53.000000000 +0100
+++ new/Text-CSV_XS-1.53/Makefile.PL 2023-10-12 15:50:23.000000000 +0200
@@ -169,7 +169,7 @@
'doc/CSV_XS.3: CSV_XS.pm',
' pod2man < $? > $@',
'doc/CSV_XS.man: doc/CSV_XS.3',
- ' nroff -mandoc < $? > $@',
+ ' nroff2man < $? > $@',
'doc/csv2xlsx.md: examples/csv2xlsx',
' pod2markdown < $? > $@',
'doc/csv2xlsx.html: examples/csv2xlsx',
@@ -177,7 +177,7 @@
'doc/csv2xlsx.3: examples/csv2xlsx',
' pod2man < $? > $@',
'doc/csv2xlsx.man: doc/csv2xlsx.3',
- ' nroff -mandoc < $? > $@',
+ ' nroff2man < $? > $@',
'',
$min_vsn;
} # postamble
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/cpanfile
new/Text-CSV_XS-1.53/cpanfile
--- old/Text-CSV_XS-1.52/cpanfile 2023-09-21 13:20:30.000000000 +0200
+++ new/Text-CSV_XS-1.53/cpanfile 2023-11-23 10:19:13.000000000 +0100
@@ -1,7 +1,7 @@
requires "IO::Handle";
requires "XSLoader";
-recommends "Encode" => "3.19";
+recommends "Encode" => "3.20";
on "configure" => sub {
requires "ExtUtils::MakeMaker";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/examples/csv2xls
new/Text-CSV_XS-1.53/examples/csv2xls
--- old/Text-CSV_XS-1.52/examples/csv2xls 2023-01-03 13:37:08.000000000
+0100
+++ new/Text-CSV_XS-1.53/examples/csv2xls 2023-11-14 13:48:22.000000000
+0100
@@ -1,12 +1,12 @@
#!/pro/bin/perl
# csv2xls: Convert csv to xls
-# (m)'20 [25 Mar 2020] Copyright H.M.Brand 2007-2023
+# (m)'23 [14 Nov 2023] Copyright H.M.Brand 2007-2023
use 5.012000;
use warnings;
-our $VERSION = "1.80";
+our $VERSION = "1.81";
sub usage {
my $err = shift and select STDERR;
@@ -41,7 +41,7 @@
exit $err;
} # usage
-use Getopt::Long qw(:config bundling nopermute passthrough);
+use Getopt::Long qw(:config bundling nopermute noignorecase passthrough);
my $sep; # Set after reading first line in a flurry attempt to
auto-detect
my $quo = '"';
my $esc = '"';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/examples/csv2xlsx
new/Text-CSV_XS-1.53/examples/csv2xlsx
--- old/Text-CSV_XS-1.52/examples/csv2xlsx 2023-01-03 13:17:37.000000000
+0100
+++ new/Text-CSV_XS-1.53/examples/csv2xlsx 2023-11-14 13:48:55.000000000
+0100
@@ -1,12 +1,12 @@
#!/pro/bin/perl
# csv2xlsx: Convert csv to xlsx
-# (m)'22 Copyright H.M.Brand 2007-2023
+# (m)'23 Copyright H.M.Brand 2007-2023
use 5.014000;
use warnings;
-our $VERSION = "1.20 - 2022-06-21";
+our $VERSION = "1.23 - 2023-11-14";
sub usage {
my $err = shift and select STDERR;
@@ -35,6 +35,9 @@
-f force usage of <xlsx> if already exists (unlink before use)
-d <dtfmt> use <dtfmt> as date formats. Default = 'dd-mm-yyyy'
-C <C:fmt> use <fmt> as currency formats for currency <C>, no default
+ --font=F set default font (default Calibri)
+ --fs=N set font size (default 10)
+ 'M' = 'mono', 'D' = 'DejaVu Sans', 'DM' = 'DejaVu Sans Mono'
-D cols only convert dates in columns <cols>.
Default is everywhere. -D0 is disable
-L N limit export to N rows
@@ -42,6 +45,7 @@
--de Some CSV fields might be double-encoded. Try to fix that.
-m merge multiple CSV's into a single xlsx (separate sheets)
-o is required, all arguments should be existing files
+ --skip-empty Skip empty files on merge
-S <cp> Split CSV on COLUMNxPAT into separate sheets. See --man
or --info for options/features and examples. May repeat.
--sl=C Use column C as sheet label when splitting with -S
@@ -52,10 +56,10 @@
use Text::CSV_XS;
use Excel::Writer::XLSX;
-use List::Util qw( first );
-use Date::Calc qw( Delta_Days Days_in_Month );
-use Encode qw( from_to );
-use Getopt::Long qw(:config bundling passthrough );
+use List::Util qw( first );
+use Date::Calc qw( Delta_Days Days_in_Month );
+use Encode qw( from_to );
+use Getopt::Long qw(:config bundling passthrough noignorecase );
my $quo = '"';
my $esc = '"';
my $wdt = 4; # Default minimal column width
@@ -79,6 +83,8 @@
"d|date-fmt=s" => \$dtf,
"D|date-col=s" => \$dtc,
"C|curr-fmt=s" => \$crf,
+ "font=s" => \my $font,
+ "fs|font-size=i" => \my $font_size,
"f|force!" => \my $frc,
"F|formulas!" => \my $frm,
"Fa=s" => \$fac,
@@ -91,6 +97,7 @@
"u|utf-8|utf8!" => \my $utf,
"de|fix-utf8!" => \my $dutf, # double encoded? \x{c3}\x{ab} => \x{100}
"m|merge!" => \my $mrg,
+ "skip-empty!" => \my $skip_empty,
"S|split=s" => \my @split,
"sl|split-label=s"=> \my $split_sl,
"L|row-limit=i" => \my $row_limit,
@@ -131,8 +138,10 @@
push @csv => $_;
next;
}
- warn "Argument $_ is not an existing (CSV) file\n";
- usage (1);
+ unless ($skip_empty) {
+ warn "Argument $_ is not an existing (CSV) file\n";
+ usage (1);
+ }
}
$xls && @csv or usage (1);
@ARGV = @csv;
@@ -195,6 +204,7 @@
my $wbk = Excel::Writer::XLSX->new ($xls);
$dtf =~ s/j/y/g;
my %fmt = (
+ dflt => $wbk->add_format (),
date => $wbk->add_format (align => "center", num_format => $dtf),
rest => $wbk->add_format (align => "left"),
wrap => $wbk->add_format (text_wrap => 1),
@@ -203,6 +213,15 @@
num_format => "$1 $2",
align => "right",
);
+if ($font) {
+ $font eq "M" and $font = "mono";
+ $font eq "D" and $font = "DejaVu Sans";
+ $font eq "DM" and $font = "DejaVu Sans Mono";
+ $_->set_font ($font) for values %fmt;
+ }
+if ($font_size) {
+ $_->set_size ($font_size) for values %fmt;
+ }
my @args = @ARGV ? @ARGV : ("");
foreach my $csvf (@args) {
@@ -363,12 +382,12 @@
from_to ($val, "utf-8", "ucs2");
$val =~ m/\n/
? $wks->write_unicode ($h, $c, $val, $fmt{wrap})
- : $wks->write_unicode ($h, $c, $val);
+ : $wks->write_unicode ($h, $c, $val, $fmt{dflt});
}
else {
$val =~ m/\n/
? $wks->write_string ($h, $c, $val, $fmt{wrap})
- : $wks->write_string ($h, $c, $val);
+ : $wks->write_string ($h, $c, $val, $fmt{dflt});
}
next;
}
@@ -397,7 +416,7 @@
$wks->write_string ($h, $c, $val);
}
else {
- $wks->write ($h, $c, $val);
+ $wks->write ($h, $c, $val, $fmt{dflt});
}
}
++$h % 100 or $opt_v && printf STDERR "%6d x %6d\r", $w, $h;
@@ -510,6 +529,28 @@
-C '$:### ### ##0.00'
+=item --font=Calibri
+
+You can set the default font. The XLSX writer used sets the default font
+face to C<Calibri>.
+
+ --font=Arial
+
+There are 3 default shortcuts
+
+ --font=M
+ --font=D
+ --font=DM
+
+Setting the font to C<mono>, C<DejaVu Sans>, or C<DejaVu Sans Mono>.
+
+=item --fs=10
+
+=item --font-size=10
+
+Optional set the default font-size to anything other than the default 10.
+Must be a positive integer. No checks.
+
=item -f
=item --force
@@ -581,6 +622,11 @@
With this option, the option C<-o> is required. All arguments should be
existing files. Piping is not supported.
+=item --skip-empty
+
+When merging CSV files with C<-m>, skip empty files. The default is to exit
+with an error message.
+
=item -L N
=item --row-limit=N
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/t/47_comment.t
new/Text-CSV_XS-1.53/t/47_comment.t
--- old/Text-CSV_XS-1.52/t/47_comment.t 2021-03-20 18:04:28.000000000 +0100
+++ new/Text-CSV_XS-1.53/t/47_comment.t 2023-11-20 18:39:05.000000000 +0100
@@ -4,7 +4,7 @@
use warnings;
use Test::More;
-use Text::CSV_XS;
+use Text::CSV_XS qw(csv);
BEGIN {
if ($] < 5.008002) {
@@ -12,7 +12,7 @@
}
else {
require Encode;
- plan tests => 60;
+ plan tests => 61;
}
require "./t/util.pl";
}
@@ -56,4 +56,17 @@
}
}
+is_deeply (csv (
+ in => *DATA,
+ sep_char => "|",
+ headers => "auto",
+ allow_whitespace => 1,
+ comment_str => "#"
+ ), [{ id => 42, name => "foo" }], "Last record is comment");
+
1;
+__END__
+id | name
+#
+42 | foo
+#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Text-CSV_XS-1.52/t/67_emptrow.t
new/Text-CSV_XS-1.53/t/67_emptrow.t
--- old/Text-CSV_XS-1.52/t/67_emptrow.t 2023-08-07 15:01:22.000000000 +0200
+++ new/Text-CSV_XS-1.53/t/67_emptrow.t 2023-11-20 08:44:25.000000000 +0100
@@ -10,7 +10,7 @@
plan skip_all => "This test unit requires perl-5.8.1 or higher";
}
else {
- plan tests => 47;
+ plan tests => 56;
}
use_ok "Text::CSV_XS", ("csv");
@@ -47,7 +47,7 @@
is ($csv->skip_empty_rows (0), 0, "+0");
is ($csv->skip_empty_rows (undef), 0, "undef");
-open my $fh, ">", $tfn;
+open my $fh, ">", $tfn or BAIL_OUT "$tfn: $!\n";
print $fh "a,b,c,d\n";
print $fh "1,2,0,4\n";
print $fh "4,0,9,1\n";
@@ -89,6 +89,14 @@
$ea,[8,2,7,1],$ea,$ea,[5,7,9,3],$ea], "A Callback");
is_deeply (csv (@parg, skip_empty_rows => sub {0}), \@head, "A Callback 0");
+# Array behavior (line by line)
+open $fh, "<", $tfn;
+$csv = Text::CSV_XS->new ({ skip_empty_rows => 1 });
+while (my $row = $csv->getline ($fh)) {
+ ok (@$row, "Row has columns");
+ }
+close $fh;
+
# Hash behavior
push @parg => bom => 1;
my $eh = { a => "", b => undef, c => undef, d => undef },
@@ -122,3 +130,13 @@
{ a => 5, b => 7, c => 9, d => 3 },$eh], "H Callback");
is_deeply (csv (@parg, skip_empty_rows => sub {0}), \@head, "H Callback 0");
+
+# Hash behavior (line by line)
+open $fh, "<", $tfn;
+$csv = Text::CSV_XS->new ({ skip_empty_rows => 1 });
+my $cols = $csv->getline ($fh);
+$csv->column_names (@$cols);
+while (my $row = $csv->getline_hr ($fh)) {
+ isnt ($row->{a}, undef, "Column 'a' is defined");
+ }
+close $fh;