1DBD::CSV(3)           User Contributed Perl Documentation          DBD::CSV(3)
2
3
4

NAME

6       DBD::CSV - DBI driver for CSV files
7

SYNOPSIS

9           use DBI;
10           # See "Creating database handle" below
11           $dbh = DBI->connect ("dbi:CSV:", undef, undef, {
12               f_ext      => ".csv/r",
13               RaiseError => 1,
14               }) or die "Cannot connect: $DBI::errstr";
15
16           # Simple statements
17           $dbh->do ("CREATE TABLE foo (id INTEGER, name CHAR (10))");
18
19           # Selecting
20           my $sth = $dbh->prepare ("select * from foo");
21           $sth->execute;
22           $sth->bind_columns (\my ($id, $name));
23           while ($sth->fetch) {
24               print "id: $id, name: $name\n";
25               }
26
27           # Updates
28           my $sth = $dbh->prepare ("UPDATE foo SET name = ? WHERE id = ?");
29           $sth->execute ("DBI rocks!", 1);
30           $sth->finish;
31
32           $dbh->disconnect;
33

DESCRIPTION

35       The DBD::CSV module is yet another driver for the DBI (Database
36       independent interface for Perl). This one is based on the SQL "engine"
37       SQL::Statement and the abstract DBI driver DBD::File and implements
38       access to so-called CSV files (Comma Separated Values). Such files are
39       often used for exporting MS Access and MS Excel data.
40
41       See DBI for details on DBI, SQL::Statement for details on
42       SQL::Statement and DBD::File for details on the base class DBD::File.
43
44   Prerequisites
45       The only system dependent feature that DBD::File uses, is the "flock
46       ()" function. Thus the module should run (in theory) on any system with
47       a working "flock ()", in particular on all Unix machines and on Windows
48       NT. Under Windows 95 and MacOS the use of "flock ()" is disabled, thus
49       the module should still be usable.
50
51       Unlike other DBI drivers, you don't need an external SQL engine or a
52       running server. All you need are the following Perl modules, available
53       from any CPAN mirror, for example
54
55         http://search.cpan.org/
56
57       DBI A recent version of the DBI (Database independent interface for
58           Perl).  See below why.
59
60       DBD::File
61           This is the base class for DBD::CSV, and it is part of the DBI
62           distribution. As DBD::CSV requires a matching version of DBD::File
63           which is (partly) developed by the same team that maintains
64           DBD::CSV. See META.json or Makefile.PL for the minimum versions.
65
66       SQL::Statement
67           A simple SQL engine. This module defines all of the SQL syntax for
68           DBD::CSV, new SQL support is added with each release so you should
69           look for updates to SQL::Statement regularly.
70
71           It is possible to run "DBD::CSV" without this module if you define
72           the environment variable $DBI_SQL_NANO to 1. This will reduce the
73           SQL support a lot though. See DBI::SQL::Nano for more details. Note
74           that the test suite does only test in this mode in the development
75           environment.
76
77       Text::CSV_XS
78           This module is used to read and write rows in a CSV file.
79
80   Installation
81       Installing this module (and the prerequisites from above) is quite
82       simple.  The simplest way is to install the bundle:
83
84           $ cpan Bundle::DBD::CSV
85
86       Alternatively, you can name them all
87
88           $ cpan Text::CSV_XS DBI DBD::CSV
89
90       or even trust "cpan" to resolve all dependencies for you:
91
92           $ cpan DBD::CSV
93
94       If you cannot, for whatever reason, use cpan, fetch all modules from
95       CPAN, and build with a sequence like:
96
97           gzip -d < DBD-CSV-0.40.tgz | tar xf -
98
99       (this is for Unix users, Windows users would prefer WinZip or something
100       similar) and then enter the following:
101
102           cd DBD-CSV-0.40
103           perl Makefile.PL
104           make test
105
106       If any tests fail, let us know. Otherwise go on with
107
108           make install UNINST=1
109
110       Note that you almost definitely need root or administrator permissions.
111       If you don't have them, read the ExtUtils::MakeMaker man page for
112       details on installing in your own directories. ExtUtils::MakeMaker.
113
114   Supported SQL Syntax
115       All SQL processing for DBD::CSV is done by SQL::Statement. See
116       SQL::Statement for more specific information about its feature set.
117       Features include joins, aliases, built-in and user-defined functions,
118       and more.  See SQL::Statement::Syntax for a description of the SQL
119       syntax supported in DBD::CSV.
120
121       Table- and column-names are case insensitive unless quoted. Column
122       names will be sanitized unless "raw_header" is true.
123

Using DBD::CSV with DBI

125       For most things, DBD-CSV operates the same as any DBI driver.  See DBI
126       for detailed usage.
127
128   Creating a database handle (connect)
129       Creating a database handle usually implies connecting to a database
130       server.  Thus this command reads
131
132           use DBI;
133           my $dbh = DBI->connect ("dbi:CSV:", "", "", {
134               f_dir => "/home/user/folder",
135               });
136
137       The directory tells the driver where it should create or open tables
138       (a.k.a.  files). It defaults to the current directory, so the following
139       are equivalent:
140
141           $dbh = DBI->connect ("dbi:CSV:");
142           $dbh = DBI->connect ("dbi:CSV:", undef, undef, { f_dir => "." });
143           $dbh = DBI->connect ("dbi:CSV:f_dir=.");
144
145       We were told, that VMS might - for whatever reason - require:
146
147           $dbh = DBI->connect ("dbi:CSV:f_dir=");
148
149       The preferred way of passing the arguments is by driver attributes:
150
151           # specify most possible flags via driver flags
152           $dbh = DBI->connect ("dbi:CSV:", undef, undef, {
153               f_schema         => undef,
154               f_dir            => "data",
155               f_dir_search     => [],
156               f_ext            => ".csv/r",
157               f_lock           => 2,
158               f_encoding       => "utf8",
159
160               csv_eol          => "\r\n",
161               csv_sep_char     => ",",
162               csv_quote_char   => '"',
163               csv_escape_char  => '"',
164               csv_class        => "Text::CSV_XS",
165               csv_null         => 1,
166               csv_bom          => 0,
167               csv_tables       => {
168                   syspwd => {
169                       sep_char    => ":",
170                       quote_char  => undef,
171                       escape_char => undef,
172                       file        => "/etc/passwd",
173                       col_names   => [qw( login password
174                                           uid gid realname
175                                           directory shell )],
176                       },
177                   },
178
179               RaiseError       => 1,
180               PrintError       => 1,
181               FetchHashKeyName => "NAME_lc",
182               }) or die $DBI::errstr;
183
184       but you may set these attributes in the DSN as well, separated by
185       semicolons.  Pay attention to the semi-colon for "csv_sep_char" (as
186       seen in many CSV exports from MS Excel) is being escaped in below
187       example, as is would otherwise be seen as attribute separator:
188
189           $dbh = DBI->connect (
190               "dbi:CSV:f_dir=$ENV{HOME}/csvdb;f_ext=.csv;f_lock=2;" .
191               "f_encoding=utf8;csv_eol=\n;csv_sep_char=\\;;" .
192               "csv_quote_char=\";csv_escape_char=\\;csv_class=Text::CSV_XS;" .
193               "csv_null=1") or die $DBI::errstr;
194
195       Using attributes in the DSN is easier to use when the DSN is derived
196       from an outside source (environment variable, database entry, or
197       configure file), whereas specifying entries in the attribute hash is
198       easier to read and to maintain.
199
200       The default value for "csv_binary" is 1 (True).
201
202       The default value for "csv_auto_diag" is <1>. Note that this might
203       cause trouble on perl versions older than 5.8.9, so up to and including
204       perl version 5.8.8 it might be required to use ";csv_auto_diag=0"
205       inside the "DSN" or "csv_auto_diag =" 0> inside the attributes.
206
207   Creating and dropping tables
208       You can create and drop tables with commands like the following:
209
210           $dbh->do ("CREATE TABLE $table (id INTEGER, name CHAR (64))");
211           $dbh->do ("DROP TABLE $table");
212
213       Note that currently only the column names will be stored and no other
214       data.  Thus all other information including column type (INTEGER or
215       CHAR (x), for example), column attributes (NOT NULL, PRIMARY KEY, ...)
216       will silently be discarded. This may change in a later release.
217
218       A drop just removes the file without any warning.
219
220       See DBI for more details.
221
222       Table names cannot be arbitrary, due to restrictions of the SQL syntax.
223       I recommend that table names are valid SQL identifiers: The first
224       character is alphabetic, followed by an arbitrary number of
225       alphanumeric characters. If you want to use other files, the file names
226       must start with "/", "./" or "../" and they must not contain white
227       space.
228
229   Inserting, fetching and modifying data
230       The following examples insert some data in a table and fetch it back:
231       First, an example where the column data is concatenated in the SQL
232       string:
233
234           $dbh->do ("INSERT INTO $table VALUES (1, ".
235                      $dbh->quote ("foobar") . ")");
236
237       Note the use of the quote method for escaping the word "foobar". Any
238       string must be escaped, even if it does not contain binary data.
239
240       Next, an example using parameters:
241
242           $dbh->do ("INSERT INTO $table VALUES (?, ?)", undef, 2,
243                     "It's a string!");
244
245       Note that you don't need to quote column data passed as parameters.
246       This version is particularly well designed for loops. Whenever
247       performance is an issue, I recommend using this method.
248
249       You might wonder about the "undef". Don't wonder, just take it as it
250       is. :-) It's an attribute argument that I have never used and will be
251       passed to the prepare method as the second argument.
252
253       To retrieve data, you can use the following:
254
255           my $query = "SELECT * FROM $table WHERE id > 1 ORDER BY id";
256           my $sth   = $dbh->prepare ($query);
257           $sth->execute ();
258           while (my $row = $sth->fetchrow_hashref) {
259               print "Found result row: id = ", $row->{id},
260                     ", name = ", $row->{name};
261               }
262           $sth->finish ();
263
264       Again, column binding works: The same example again.
265
266           my $sth = $dbh->prepare (qq;
267               SELECT * FROM $table WHERE id > 1 ORDER BY id;
268               ;);
269           $sth->execute;
270           my ($id, $name);
271           $sth->bind_columns (undef, \$id, \$name);
272           while ($sth->fetch) {
273               print "Found result row: id = $id, name = $name\n";
274               }
275           $sth->finish;
276
277       Of course you can even use input parameters. Here's the same example
278       for the third time:
279
280           my $sth = $dbh->prepare ("SELECT * FROM $table WHERE id = ?");
281           $sth->bind_columns (undef, \$id, \$name);
282           for (my $i = 1; $i <= 2; $i++) {
283               $sth->execute ($id);
284               if ($sth->fetch) {
285                   print "Found result row: id = $id, name = $name\n";
286                   }
287               $sth->finish;
288               }
289
290       See DBI for details on these methods. See SQL::Statement for details on
291       the WHERE clause.
292
293       Data rows are modified with the UPDATE statement:
294
295           $dbh->do ("UPDATE $table SET id = 3 WHERE id = 1");
296
297       Likewise you use the DELETE statement for removing rows:
298
299           $dbh->do ("DELETE FROM $table WHERE id > 1");
300
301   Error handling
302       In the above examples we have never cared about return codes. Of
303       course, this is not recommended. Instead we should have written (for
304       example):
305
306           my $sth = $dbh->prepare ("SELECT * FROM $table WHERE id = ?") or
307               die "prepare: " . $dbh->errstr ();
308           $sth->bind_columns (undef, \$id, \$name) or
309               die "bind_columns: " . $dbh->errstr ();
310           for (my $i = 1; $i <= 2; $i++) {
311               $sth->execute ($id) or
312                   die "execute: " . $dbh->errstr ();
313               $sth->fetch and
314                   print "Found result row: id = $id, name = $name\n";
315               }
316           $sth->finish ($id) or die "finish: " . $dbh->errstr ();
317
318       Obviously this is tedious. Fortunately we have DBI's RaiseError
319       attribute:
320
321           $dbh->{RaiseError} = 1;
322           $@ = "";
323           eval {
324               my $sth = $dbh->prepare ("SELECT * FROM $table WHERE id = ?");
325               $sth->bind_columns (undef, \$id, \$name);
326               for (my $i = 1; $i <= 2; $i++) {
327                   $sth->execute ($id);
328                   $sth->fetch and
329                       print "Found result row: id = $id, name = $name\n";
330                   }
331               $sth->finish ($id);
332               };
333           $@ and die "SQL database error: $@";
334
335       This is not only shorter, it even works when using DBI methods within
336       subroutines.
337

DBI database handle attributes

339   Metadata
340       The following attributes are handled by DBI itself and not by
341       DBD::File, thus they all work as expected:
342
343           Active
344           ActiveKids
345           CachedKids
346           CompatMode             (Not used)
347           InactiveDestroy
348           Kids
349           PrintError
350           RaiseError
351           Warn                   (Not used)
352
353       The following DBI attributes are handled by DBD::File:
354
355       AutoCommit
356           Always on
357
358       ChopBlanks
359           Works
360
361       NUM_OF_FIELDS
362           Valid after "$sth->execute"
363
364       NUM_OF_PARAMS
365           Valid after "$sth->prepare"
366
367       NAME
368       NAME_lc
369       NAME_uc
370           Valid after "$sth->execute"; undef for Non-Select statements.
371
372       NULLABLE
373           Not really working. Always returns an array ref of one's, as
374           DBD::CSV does not verify input data. Valid after "$sth->execute";
375           undef for non-Select statements.
376
377       These attributes and methods are not supported:
378
379           bind_param_inout
380           CursorName
381           LongReadLen
382           LongTruncOk
383

DBD-CSV specific database handle attributes

385       In addition to the DBI attributes, you can use the following dbh
386       attributes:
387
388   DBD::File attributes
389       f_dir
390           This attribute is used for setting the directory where CSV files
391           are opened. Usually you set it in the dbh and it defaults to the
392           current directory ("."). However, it may be overridden in statement
393           handles.
394
395       f_dir_search
396           This attribute optionally defines a list of extra directories to
397           search when opening existing tables. It should be an anonymous list
398           or an array reference listing all folders where tables could be
399           found.
400
401               my $dbh = DBI->connect ("dbi:CSV:", "", "", {
402                   f_dir        => "data",
403                   f_dir_search => [ "ref/data", "ref/old" ],
404                   f_ext        => ".csv/r",
405                   }) or die $DBI::errstr;
406
407       f_ext
408           This attribute is used for setting the file extension.
409
410       f_schema
411           This attribute allows you to set the database schema name. The
412           default is to use the owner of "f_dir". "undef" is allowed, but not
413           in the DSN part.
414
415               my $dbh = DBI->connect ("dbi:CSV:", "", "", {
416                   f_schema => undef,
417                   f_dir    => "data",
418                   f_ext    => ".csv/r",
419                   }) or die $DBI::errstr;
420
421       f_encoding
422           This attribute allows you to set the encoding of the data. With
423           CSV, it is not possible to set (and remember) the encoding on a
424           column basis, but DBD::File now allows the encoding to be set on
425           the underlying file. If this attribute is not set, or undef is
426           passed, the file will be seen as binary.
427
428       f_lock
429           With this attribute you can specify a locking mode to be used (if
430           locking is supported at all) for opening tables. By default, tables
431           are opened with a shared lock for reading, and with an exclusive
432           lock for writing. The supported modes are:
433
434           0 Force no locking at all.
435
436           1 Only shared locks will be used.
437
438           2 Only exclusive locks will be used.
439
440       But see "KNOWN BUGS" in DBD::File.
441
442   DBD::CSV specific attributes
443       csv_class
444           The attribute csv_class controls the CSV parsing engine. This
445           defaults to "Text::CSV_XS", but "Text::CSV" can be used in some
446           cases, too.  Please be aware that "Text::CSV" does not care about
447           any edge case as "Text::CSV_XS" does and that "Text::CSV" is
448           probably about 100 times slower than "Text::CSV_XS".
449
450   Text::CSV_XS specific attributes
451       csv_eol
452       csv_sep_char
453       csv_quote_char
454       csv_escape_char
455       csv_csv
456           The attributes csv_eol, csv_sep_char, csv_quote_char and
457           csv_escape_char are corresponding to the respective attributes of
458           the csv_class (usually Text::CSV_CS) object. You may want to set
459           these attributes if you have unusual CSV files like /etc/passwd or
460           MS Excel generated CSV files with a semicolon as separator.
461           Defaults are "\015\012"", ",", """ and """, respectively.
462
463           The csv_eol attribute defines the end-of-line pattern, which is
464           better known as a record separator pattern since it separates
465           records.  The default is windows-style end-of-lines "\015\012" for
466           output (writing) and unset for input (reading), so if on unix you
467           may want to set this to newline ("\n") like this:
468
469             $dbh->{csv_eol} = "\n";
470
471           It is also possible to use multi-character patterns as record
472           separators.  For example this file uses newlines as field
473           separators (sep_char) and the pattern "\n__ENDREC__\n" as the
474           record separators (eol):
475
476             name
477             city
478             __ENDREC__
479             joe
480             seattle
481             __ENDREC__
482             sue
483             portland
484             __ENDREC__
485
486           To handle this file, you'd do this:
487
488             $dbh->{eol}      = "\n__ENDREC__\n" ,
489             $dbh->{sep_char} = "\n"
490
491           The attributes are used to create an instance of the class
492           csv_class, by default Text::CSV_XS. Alternatively you may pass an
493           instance as csv_csv, the latter takes precedence. Note that the
494           binary attribute must be set to a true value in that case.
495
496           Additionally you may overwrite these attributes on a per-table base
497           in the csv_tables attribute.
498
499       csv_null
500           With this option set, all new statement handles will set
501           "always_quote" and "blank_is_undef" in the CSV parser and writer,
502           so it knows how to distinguish between the empty string and "undef"
503           or "NULL". You cannot reset it with a false value. You can pass it
504           to connect, or set it later:
505
506             $dbh = DBI->connect ("dbi:CSV:", "", "", { csv_null => 1 });
507
508             $dbh->{csv_null} = 1;
509
510       csv_bom
511           With this option set, the CSV parser will try to detect BOM (Byte
512           Order Mark) in the header line. This requires Text::CSV_XS version
513           1.22 or higher.
514
515             $dbh = DBI->connect ("dbi:CSV:", "", "", { csv_bom => 1 });
516
517             $dbh->{csv_bom} = 1;
518
519       csv_tables
520           This hash ref is used for storing table dependent metadata. For any
521           table it contains an element with the table name as key and another
522           hash ref with the following attributes:
523
524           o   All valid attributes to the CSV parsing module. Any of them can
525               optionally be prefixed with "csv_".
526
527           o   All attributes valid to DBD::File
528
529           If you pass it "f_file" or its alias "file", "f_ext" has no effect,
530           but "f_dir" and "f_encoding" still have.
531
532             csv_tables => {
533                 syspwd => {                   # Table name
534                     csv_sep_char => ":",      # Text::CSV_XS
535                     quote_char   => undef,    # Text::CSV_XS
536                     escape_char  => undef,    # Text::CSV_XS
537                     f_dir        => "/etc",   # DBD::File
538                     f_file       => "passwd", # DBD::File
539                     col_names    =>           # DBD::File
540                       [qw( login password uid gid realname directory shell )],
541                     },
542                 },
543
544       csv_*
545           All other attributes that start with "csv_" and are not described
546           above will be passed to "Text::CSV_XS" (without the "csv_" prefix).
547           These extra options are only likely to be useful for reading
548           (select) handles. Examples:
549
550             $dbh->{csv_allow_whitespace}    = 1;
551             $dbh->{csv_allow_loose_quotes}  = 1;
552             $dbh->{csv_allow_loose_escapes} = 1;
553
554           See the "Text::CSV_XS" documentation for the full list and the
555           documentation.
556
557   Driver specific attributes
558       f_file
559           The name of the file used for the table; defaults to
560
561               "$dbh->{f_dir}/$table"
562
563       eol
564       sep_char
565       quote_char
566       escape_char
567       class
568       csv These correspond to the attributes csv_eol, csv_sep_char,
569           csv_quote_char, csv_escape_char, csv_class and csv_csv.  The
570           difference is that they work on a per-table basis.
571
572       col_names
573       skip_first_row
574           By default DBD::CSV assumes that column names are stored in the
575           first row of the CSV file and sanitizes them (see "raw_header"
576           below). If this is not the case, you can supply an array ref of
577           table names with the col_names attribute. In that case the
578           attribute skip_first_row will be set to FALSE.
579
580           If you supply an empty array ref, the driver will read the first
581           row for you, count the number of columns and create column names
582           like "col0", "col1", ...
583
584           Note that column names that match reserved SQL words will cause
585           unwanted and sometimes confusing errors. If your CSV has headers
586           that match reserved words, you will require these two attributes.
587
588           If "test.csv" looks like
589
590            select,from
591            1,2
592
593           the select query would result in "select select, from from test;",
594           which obviously is illegal SQL.
595
596       raw_header
597           Due to the SQL standard, field names cannot contain special
598           characters like a dot (".") or a space (" ") unless the column
599           names are quoted.  Following the approach of mdb_tools, all these
600           tokens are translated to an underscore ("_") when reading the first
601           line of the CSV file, so all field names are 'sanitized'. If you do
602           not want this to happen, set "raw_header" to a true value and the
603           entries in the first line of the CSV data will be used verbatim for
604           column headers and field names.  DBD::CSV cannot guarantee that any
605           part in the toolchain will work if field names have those
606           characters, and the chances are high that the SQL statements will
607           fail.
608
609           Currently, the sanitizing of headers is as simple as
610
611             s/\W/_/g;
612
613           Note that headers (column names) might be folded in other parts of
614           the code stack, specifically SQL::Statement, whose docs mention:
615
616            Wildcards are expanded to lower cased identifiers. This might
617            confuse some people, but it was easier to implement.
618
619           That means that in
620
621            my $sth = $dbh->prepare ("select * from foo");
622            $sth->execute;
623            while (my $row = $sth->fetchrow_hashref) {
624                say for keys %$row;
625                }
626
627           all keys will show as all lower case, regardless of the original
628           header.
629
630       It's strongly recommended to check the attributes supported by
631       "Metadata" in DBD::File.
632
633       Example: Suppose you want to use /etc/passwd as a CSV file. :-) There
634       simplest way is:
635
636           use DBI;
637           my $dbh = DBI->connect ("dbi:CSV:", undef, undef, {
638               f_dir           => "/etc",
639               csv_sep_char    => ":",
640               csv_quote_char  => undef,
641               csv_escape_char => undef,
642               });
643           $dbh->{csv_tables}{passwd} = {
644               col_names => [qw( login password uid gid realname
645                                 directory shell )];
646               };
647           $sth = $dbh->prepare ("SELECT * FROM passwd");
648
649       Another possibility where you leave all the defaults as they are and
650       override them on a per table basis:
651
652           require DBI;
653           my $dbh = DBI->connect ("dbi:CSV:");
654           $dbh->{csv_tables}{passwd} = {
655               eol         => "\n",
656               sep_char    => ":",
657               quote_char  => undef,
658               escape_char => undef,
659               f_file      => "/etc/passwd",
660               col_names   => [qw( login password uid gid
661                                   realname directory shell )],
662               };
663           $sth = $dbh->prepare ("SELECT * FROM passwd");
664
665   Driver private methods
666       These methods are inherited from DBD::File:
667
668       data_sources
669           The "data_sources" method returns a list of sub-directories of the
670           current directory in the form "dbi:CSV:directory=$dirname".
671
672           If you want to read the sub-directories of another directory, use
673
674               my $drh  = DBI->install_driver ("CSV");
675               my @list = $drh->data_sources (f_dir => "/usr/local/csv_data");
676
677       list_tables
678           This method returns a list of file-names inside $dbh->{directory}.
679           Example:
680
681               my $dbh  = DBI->connect ("dbi:CSV:directory=/usr/local/csv_data");
682               my @list = $dbh->func ("list_tables");
683
684           Note that the list includes all files contained in the directory,
685           even those that have non-valid table names, from the view of SQL.
686           See "Creating and dropping tables" above.
687

KNOWN ISSUES

689       ยท   The module is using flock () internally. However, this function is
690           not available on some platforms. Use of flock () is disabled on
691           MacOS and Windows 95: There's no locking at all (perhaps not so
692           important on these operating systems, as they are for single users
693           anyways).
694

TODO

696       Tests
697           Aim for a full 100% code coverage
698
699            - eol      Make tests for different record separators.
700            - csv_xs   Test with a variety of combinations for
701                       sep_char, quote_char, and escape_char testing
702            - quoting  $dbh->do ("drop table $_") for DBI-tables ();
703            - errors   Make sure that all documented exceptions are tested.
704                       . write to write-protected file
705                       . read from badly formatted csv
706                       . pass bad arguments to csv parser while fetching
707
708           Add tests that specifically test DBD::File functionality where that
709           is useful.
710
711       RT  Attack all open DBD::CSV bugs in RT
712
713       CPAN::Forum
714           Attack all items in http://www.cpanforum.com/dist/DBD-CSV
715
716       Documentation
717           Expand on error-handling, and document all possible errors.  Use
718           Text::CSV_XS::error_diag () wherever possible.
719
720       Debugging
721           Implement and document dbd_verbose.
722
723       Data dictionary
724           Investigate the possibility to store the data dictionary in a file
725           like .sys$columns that can store the field attributes (type, key,
726           nullable).
727
728       Examples
729           Make more real-life examples from the docs in examples/
730

SEE ALSO

732       DBI, Text::CSV_XS, SQL::Statement, DBI::SQL::Nano
733
734       For help on the use of DBD::CSV, see the DBI users mailing list:
735
736         http://lists.cpan.org/showlist.cgi?name=dbi-users
737
738       For general information on DBI see
739
740         http://dbi.perl.org/ and http://faq.dbi-support.com/
741

AUTHORS and MAINTAINERS

743       This module is currently maintained by
744
745           H.Merijn Brand <h.m.brand@xs4all.nl>
746
747       in close cooperation with and help from
748
749           Jens Rehsack <sno@NetBSD.org>
750
751       The original author is Jochen Wiedmann.  Previous maintainer was Jeff
752       Zucker
753
755       Copyright (C) 2009-2020 by H.Merijn Brand Copyright (C) 2004-2009 by
756       Jeff Zucker Copyright (C) 1998-2004 by Jochen Wiedmann
757
758       All rights reserved.
759
760       You may distribute this module under the terms of either the GNU
761       General Public License or the Artistic License, as specified in the
762       Perl README file.
763
764
765
766perl v5.32.0                      2020-07-27                       DBD::CSV(3)
Impressum