home *** CD-ROM | disk | FTP | other *** search
-
- <HTML>
- <HEAD>
- <TITLE>DBD::CSV - DBI driver for CSV files</TITLE>
- <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
- <LINK REV="made" HREF="mailto:">
- </HEAD>
-
- <BODY>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> DBD::CSV - DBI driver for CSV files</P></STRONG>
- </TD></TR>
- </TABLE>
-
- <A NAME="__index__"></A>
- <!-- INDEX BEGIN -->
-
- <UL>
-
- <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
-
- <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
- <LI><A HREF="#warning">WARNING</A></LI>
- <LI><A HREF="#description">DESCRIPTION</A></LI>
- <UL>
-
- <LI><A HREF="#prerequisites">Prerequisites</A></LI>
- <LI><A HREF="#installation">Installation</A></LI>
- <LI><A HREF="#creating a database handle">Creating a database handle</A></LI>
- <LI><A HREF="#creating and dropping tables">Creating and dropping tables</A></LI>
- <LI><A HREF="#inserting, fetching and modifying data">Inserting, fetching and modifying data</A></LI>
- <LI><A HREF="#error handling">Error handling</A></LI>
- <LI><A HREF="#metadata">Metadata</A></LI>
- <LI><A HREF="#driver private methods">Driver private methods</A></LI>
- <LI><A HREF="#data restrictions">Data restrictions</A></LI>
- </UL>
-
- <LI><A HREF="#todo">TODO</A></LI>
- <LI><A HREF="#known bugs">KNOWN BUGS</A></LI>
- <LI><A HREF="#author and copyright">AUTHOR AND COPYRIGHT</A></LI>
- <LI><A HREF="#see also">SEE ALSO</A></LI>
- </UL>
- <!-- INDEX END -->
-
- <HR>
- <P>
- <H1><A NAME="name">NAME</A></H1>
- <P>DBD::CSV - DBI driver for CSV files</P>
- <P>
- <HR>
- <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
- <UL>
- <LI>Linux</LI>
- <LI>Solaris</LI>
- <LI>Windows</LI>
- </UL>
- <HR>
- <H1><A NAME="synopsis">SYNOPSIS</A></H1>
- <PRE>
- use DBI;
- $dbh = DBI->connect("DBI:CSV:f_dir=/home/joe/csvdb")
- or die "Cannot connect: " . $DBI::errstr;
- $sth = $dbh->prepare("CREATE TABLE a (id INTEGER, name CHAR(10))")
- or die "Cannot prepare: " . $dbh->errstr();
- $sth->execute() or die "Cannot execute: " . $sth->errstr();
- $sth->finish();
- $dbh->disconnect();</PRE>
- <PRE>
- # Read a CSV file with ";" as the separator, as exported by
- # MS Excel. Note we need to escape the ";", otherwise it
- # would be treated as an attribute separator.
- $dbh = DBI->connect(qq{DBI:CSV:csv_sep_char=\\;});
- $sth = $dbh->prepare("SELECT * FROM info");</PRE>
- <PRE>
- # Same example, this time reading "info.csv" as a table:
- $dbh = DBI->connect(qq{DBI:CSV:csv_sep_char=\\;});
- $dbh->{'csv_tables'}->{'info'} = { 'file' => 'csv'};
- $sth = $dbh->prepare("SELECT * FROM info");</PRE>
- <P>
- <HR>
- <H1><A NAME="warning">WARNING</A></H1>
- <P>THIS IS ALPHA SOFTWARE. It is *only* 'Alpha' because the interface (API)
- is not finalized. The Alpha status does not reflect code quality or
- stability.</P>
- <P>
- <HR>
- <H1><A NAME="description">DESCRIPTION</A></H1>
- <P>The DBD::CSV module is yet another driver for the DBI (Database independent
- interface for Perl). This one is based on the SQL ``engine'' SQL::Statement
- and the abstract DBI driver DBD::File and implements access to
- so-called CSV files (Comma separated values). Such files are mostly used for
- exporting MS Access and MS Excel data.</P>
- <P>See <A HREF="#item_DBI">DBI(3)</A> for details on DBI, <A HREF="../../../SQL/Statement(3).html">the SQL::Statement(3) manpage</A> for details on
- SQL::Statement and <A HREF="../../../DBD/File(3).html">the DBD::File(3) manpage</A> for details on the base class
- DBD::File.</P>
- <P>
- <H2><A NAME="prerequisites">Prerequisites</A></H2>
- <P>The only system dependent feature that DBD::File uses, is the <A HREF="../../../lib/Pod/perlfunc.html#item_flock"><CODE>flock()</CODE></A>
- function. Thus the module should run (in theory) on any system with
- a working <A HREF="../../../lib/Pod/perlfunc.html#item_flock"><CODE>flock()</CODE></A>, in particular on all Unix machines and on Windows
- NT. Under Windows 95 and MacOS the use of <A HREF="../../../lib/Pod/perlfunc.html#item_flock"><CODE>flock()</CODE></A> is disabled, thus
- the module should still be usable,</P>
- <P>Unlike other DBI drivers, you don't need an external SQL engine
- or a running server. All you need are the following Perl modules,
- available from any CPAN mirror, for example</P>
- <PRE>
- <A HREF="ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module">ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module</A></PRE>
- <DL>
- <DT><STRONG><A NAME="item_DBI">DBI</A></STRONG><BR>
- <DD>
- the DBI (Database independent interface for Perl), version 1.00 or
- a later release
- <P></P>
- <DT><STRONG><A NAME="item_SQL%3A%3AStatement">SQL::Statement</A></STRONG><BR>
- <DD>
- a simple SQL engine
- <P></P>
- <DT><STRONG><A NAME="item_Text%3A%3ACSV_XS">Text::CSV_XS</A></STRONG><BR>
- <DD>
- this module is used for writing rows to or reading rows from CSV files.
- <P></P></DL>
- <P>
- <H2><A NAME="installation">Installation</A></H2>
- <P>Installing this module (and the prerequisites from above) is quite simple.
- You just fetch the archive, extract it with</P>
- <PRE>
- gzip -cd DBD-CSV-0.1000.tar.gz | tar xf -</PRE>
- <P>(this is for Unix users, Windows users would prefer WinZip or something
- similar) and then enter the following:</P>
- <PRE>
- cd DBD-CSV-0.1000
- perl Makefile.PL
- make
- make test</PRE>
- <P>If any tests fail, let me know. Otherwise go on with</P>
- <PRE>
- make install</PRE>
- <P>Note that you almost definitely need root or administrator permissions.
- If you don't have them, read the ExtUtils::MakeMaker man page for details
- on installing in your own directories. <A HREF="../../../lib/ExtUtils/MakeMaker.html">the ExtUtils::MakeMaker manpage</A>.</P>
- <P>
- <H2><A NAME="creating a database handle">Creating a database handle</A></H2>
- <P>Creating a database handle usually implies connecting to a database server.
- Thus this command reads</P>
- <PRE>
- use DBI;
- my $dbh = DBI->connect("DBI:CSV:f_dir=$dir");</PRE>
- <P>The directory tells the driver where it should create or open tables
- (a.k.a. files). It defaults to the current directory, thus the following
- are equivalent:</P>
- <PRE>
- $dbh = DBI->connect("DBI:CSV:");
- $dbh = DBI->connect("DBI:CSV:f_dir=.");</PRE>
- <P>You may set other attributes in the DSN string, separated by semicolons.</P>
- <P>
- <H2><A NAME="creating and dropping tables">Creating and dropping tables</A></H2>
- <P>You can create and drop tables with commands like the following:</P>
- <PRE>
- $dbh->do("CREATE TABLE $table (id INTEGER, name CHAR(64))");
- $dbh->do("DROP TABLE $table");</PRE>
- <P>Note that currently only the column names will be stored and no other data.
- Thus all other information including column type (INTEGER or CHAR(x), for
- example), column attributes (NOT NULL, PRIMARY KEY, ...) will silently be
- discarded. This may change in a later release.</P>
- <P>A drop just removes the file without any warning.</P>
- <P>See <A HREF="#item_DBI">DBI(3)</A> for more details.</P>
- <P>Table names cannot be arbitrary, due to restrictions of the SQL syntax.
- I recommend that table names are valid SQL identifiers: The first
- character is alphabetic, followed by an arbitrary number of alphanumeric
- characters. If you want to use other files, the file names must start
- with '/', './' or '../' and they must not contain white space.</P>
- <P>
- <H2><A NAME="inserting, fetching and modifying data">Inserting, fetching and modifying data</A></H2>
- <P>The following examples insert some data in a table and fetch it back:
- First all data in the string:</P>
- <PRE>
- $dbh->do("INSERT INTO $table VALUES (1, "
- . $dbh->quote("foobar") . ")");</PRE>
- <P>Note the use of the quote method for escaping the word 'foobar'. Any
- string must be escaped, even if it doesn't contain binary data.</P>
- <P>Next an example using parameters:</P>
- <PRE>
- $dbh->do("INSERT INTO $table VALUES (?, ?)", undef,
- 2, "It's a string!");</PRE>
- <P>Note that you don't need to use the quote method here, this is done
- automatically for you. This version is particularly well designed for
- loops. Whenever performance is an issue, I recommend using this method.</P>
- <P>You might wonder about the <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>. Don't wonder, just take it as it
- is. :-) It's an attribute argument that I have never ever used and
- will be parsed to the prepare method as a second argument.</P>
- <P>To retrieve data, you can use the following:</P>
- <PRE>
- my($query) = "SELECT * FROM $table WHERE id > 1 ORDER BY id";
- my($sth) = $dbh->prepare($query);
- $sth->execute();
- while (my $row = $sth->fetchrow_hashref) {
- print("Found result row: id = ", $row->{'id'},
- ", name = ", $row->{'name'});
- }
- $sth->finish();</PRE>
- <P>Again, column binding works: The same example again.</P>
- <PRE>
- my($query) = "SELECT * FROM $table WHERE id > 1 ORDER BY id";
- my($sth) = $dbh->prepare($query);
- $sth->execute();
- my($id, $name);
- $sth->bind_columns(undef, \$id, \$name);
- while ($sth->fetch) {
- print("Found result row: id = $id, name = $name\n");
- }
- $sth->finish();</PRE>
- <P>Of course you can even use input parameters. Here's the same example
- for the third time:</P>
- <PRE>
- my($query) = "SELECT * FROM $table WHERE id = ?";
- my($sth) = $dbh->prepare($query);
- $sth->bind_columns(undef, \$id, \$name);
- for (my($i) = 1; $i <= 2; $i++) {
- $sth->execute($id);
- if ($sth->fetch) {
- print("Found result row: id = $id, name = $name\n");
- }
- $sth->finish();
- }</PRE>
- <P>See <A HREF="#item_DBI">DBI(3)</A> for details on these methods. See <A HREF="../../../SQL/Statement(3).html">the SQL::Statement(3) manpage</A> for
- details on the WHERE clause.</P>
- <P>Data rows are modified with the UPDATE statement:</P>
- <PRE>
- $dbh->do("UPDATE $table SET id = 3 WHERE id = 1");</PRE>
- <P>Likewise you use the DELETE statement for removing rows:</P>
- <PRE>
- $dbh->do("DELETE FROM $table WHERE id > 1");</PRE>
- <P>
- <H2><A NAME="error handling">Error handling</A></H2>
- <P>In the above examples we have never cared about return codes. Of course,
- this cannot be recommended. Instead we should have written (for example):</P>
- <PRE>
- my($query) = "SELECT * FROM $table WHERE id = ?";
- my($sth) = $dbh->prepare($query)
- or die "prepare: " . $dbh->errstr();
- $sth->bind_columns(undef, \$id, \$name)
- or die "bind_columns: " . $dbh->errstr();
- for (my($i) = 1; $i <= 2; $i++) {
- $sth->execute($id)
- or die "execute: " . $dbh->errstr();
- if ($sth->fetch) {
- print("Found result row: id = $id, name = $name\n");
- }
- }
- $sth->finish($id)
- or die "finish: " . $dbh->errstr();</PRE>
- <P>Obviously this is tedious. Fortunately we have DBI's <EM>RaiseError</EM>
- attribute:</P>
- <PRE>
- $dbh->{'RaiseError'} = 1;
- $@ = '';
- eval {
- my($query) = "SELECT * FROM $table WHERE id = ?";
- my($sth) = $dbh->prepare($query);
- $sth->bind_columns(undef, \$id, \$name);
- for (my($i) = 1; $i <= 2; $i++) {
- $sth->execute($id);
- if ($sth->fetch) {
- print("Found result row: id = $id, name = $name\n");
- }
- }
- $sth->finish($id);
- };
- if ($@) { die "SQL database error: $@"; }</PRE>
- <P>This is not only shorter, it even works when using DBI methods within
- subroutines.</P>
- <P>
- <H2><A NAME="metadata">Metadata</A></H2>
- <P>The following attributes are handled by DBI itself and not by DBD::File,
- thus they all work as expected:</P>
- <PRE>
- Active
- ActiveKids
- CachedKids
- CompatMode (Not used)
- InactiveDestroy
- Kids
- PrintError
- RaiseError
- Warn (Not used)</PRE>
- <P>The following DBI attributes are handled by DBD::File:</P>
- <DL>
- <DT><STRONG><A NAME="item_AutoCommit">AutoCommit</A></STRONG><BR>
- <DD>
- Always on
- <P></P>
- <DT><STRONG><A NAME="item_ChopBlanks">ChopBlanks</A></STRONG><BR>
- <DD>
- Works
- <P></P>
- <DT><STRONG><A NAME="item_NUM_OF_FIELDS">NUM_OF_FIELDS</A></STRONG><BR>
- <DD>
- Valid after <CODE>$sth->execute</CODE>
- <P></P>
- <DT><STRONG><A NAME="item_NUM_OF_PARAMS">NUM_OF_PARAMS</A></STRONG><BR>
- <DD>
- Valid after <CODE>$sth->prepare</CODE>
- <P></P>
- <DT><STRONG><A NAME="item_NAME">NAME</A></STRONG><BR>
- <DD>
- Valid after <CODE>$sth->execute</CODE>; undef for Non-Select statements.
- <P></P>
- <DT><STRONG><A NAME="item_NULLABLE">NULLABLE</A></STRONG><BR>
- <DD>
- Not really working. Always returns an array ref of one's, as DBD::CSV
- doesn't verify input data. Valid after <CODE>$sth->execute</CODE>; undef for
- non-Select statements.
- <P></P></DL>
- <P>These attributes and methods are not supported:</P>
- <PRE>
- bind_param_inout
- CursorName
- LongReadLen
- LongTruncOk</PRE>
- <P>In addition to the DBI attributes, you can use the following dbh
- attributes:</P>
- <DL>
- <DT><STRONG><A NAME="item_f_dir">f_dir</A></STRONG><BR>
- <DD>
- This attribute is used for setting the directory where CSV files are
- opened. Usually you set it in the dbh, it defaults to the current
- directory (``.''). However, it is overwritable in the statement handles.
- <P></P>
- <DT><STRONG><A NAME="item_csv_eol">csv_eol</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_csv_sep_char">csv_sep_char</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_csv_quote_char">csv_quote_char</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_csv_escape_char">csv_escape_char</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_csv_class">csv_class</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_csv_csv">csv_csv</A></STRONG><BR>
- <DD>
- The attributes <EM>csv_eol</EM>, <EM>csv_sep_char</EM>, <EM>csv_quote_char</EM> and
- <EM>csv_escape_char</EM> are corresponding to the respective attributes of the
- Text::CSV_XS object. You want to set these attributes if you have unusual
- CSV files like <EM>/etc/passwd</EM> or MS Excel generated CSV files with a semicolon
- as separator. Defaults are ``\015\012'', ';', '``' and '''', respectively.
- <P>The attributes are used to create an instance of the class <EM>csv_class</EM>,
- by default Text::CSV_XS. Alternatively you may pass an instance as
- <EM>csv_csv</EM>, the latter takes precedence. Note that the <EM>binary</EM>
- attribute <EM>must</EM> be set to a true value in that case.</P>
- <P>Additionally you may overwrite these attributes on a per-table base in
- the <EM>csv_tables</EM> attribute.</P>
- <P></P>
- <DT><STRONG><A NAME="item_csv_tables">csv_tables</A></STRONG><BR>
- <DD>
- This hash ref is used for storing table dependent metadata. For any
- table it contains an element with the table name as key and another
- hash ref with the following attributes:
- <DL>
- <DT><STRONG><A NAME="item_file">file</A></STRONG><BR>
- <DD>
- The tables file name; defaults to
- <PRE>
- "$dbh->{f_dir}/$table"</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_eol">eol</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_sep_char">sep_char</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_quote_char">quote_char</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_escape_char">escape_char</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_class">class</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_csv">csv</A></STRONG><BR>
- <DD>
- These correspond to the attributes <EM>csv_eol</EM>, <EM>csv_sep_char</EM>,
- <EM>csv_quote_char</EM>, <EM>csv_escape_char</EM>, <EM>csv_class</EM> and <EM>csv_csv</EM>.
- The difference is that they work on a per-table base.
- <P></P>
- <DT><STRONG><A NAME="item_col_names">col_names</A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_skip_first_row">skip_first_row</A></STRONG><BR>
- <DD>
- By default DBD::CSV assumes that column names are stored in the first
- row of the CSV file. If this is not the case, you can supply an array
- ref of table names with the <EM>col_names</EM> attribute. In that case the
- attribute <EM>skip_first_row</EM> will be set to FALSE.
- <P>If you supply an empty array ref, the driver will read the first row
- for you, count the number of columns and create column names like
- <CODE>col0</CODE>, <CODE>col1</CODE>, ...</P>
- <P></P></DL>
- </DL>
- <P>Example: Suggest you want to use <EM>/etc/passwd</EM> as a CSV file. :-)
- There simplest way is:</P>
- <PRE>
- require DBI;
- my $dbh = DBI->connect("DBI:CSV:f_dir=/etc;csv_eol=\n;"
- . "csv_sep_char=:;csv_quote_char=;"
- . "csv_escape_char=");
- $dbh->{'csv_tables'}->{'passwd'} = {
- 'col_names' => ["login", "password", "uid", "gid", "realname",
- "directory", "shell"]
- };
- $sth = $dbh->prepare("SELECT * FROM passwd");</PRE>
- <P>Another possibility where you leave all the defaults as they are and
- overwrite them on a per table base:</P>
- <PRE>
- require DBI;
- my $dbh = DBI->connect("DBI:CSV:");
- $dbh->{'csv_tables'}->{'passwd'} = {
- 'eol' => "\n",
- 'sep_char' => ":",
- 'quote_char' => undef,
- 'escape_char' => undef,
- 'file' => '/etc/passwd',
- 'col_names' => ["login", "password", "uid", "gid", "realname",
- "directory", "shell"]
- };
- $sth = $dbh->prepare("SELECT * FROM passwd");</PRE>
- <P>
- <H2><A NAME="driver private methods">Driver private methods</A></H2>
- <P>These methods are inherited from DBD::File:</P>
- <DL>
- <DT><STRONG><A NAME="item_data_sources">data_sources</A></STRONG><BR>
- <DD>
- The <A HREF="#item_data_sources"><CODE>data_sources</CODE></A> method returns a list of subdirectories of the current
- directory in the form ``DBI:CSV:directory=$dirname''.
- <P>If you want to read the subdirectories of another directory, use</P>
- <PRE>
- my($drh) = DBI->install_driver("CSV");
- my(@list) = $drh->data_sources('f_dir' => '/usr/local/csv_data' );</PRE>
- <P></P>
- <DT><STRONG><A NAME="item_list_tables">list_tables</A></STRONG><BR>
- <DD>
- This method returns a list of file names inside $dbh->{'directory'}.
- Example:
- <PRE>
- my($dbh) = DBI->connect("DBI:CSV:directory=/usr/local/csv_data");
- my(@list) = $dbh->func('list_tables');</PRE>
- <P>Note that the list includes all files contained in the directory, even
- those that have non-valid table names, from the view of SQL. See
- <A HREF="#creating and dropping tables">Creating and dropping tables</A> above.</P>
- <P></P></DL>
- <P>
- <H2><A NAME="data restrictions">Data restrictions</A></H2>
- <P>When inserting and fetching data, you will sometimes be surprised: DBD::CSV
- doesn't correctly handle data types, in particular NULLs. If you insert
- integers, it might happen, that fetch returns a string. Of course, a string
- containing the integer, so that's perhaps not a real problem. But the
- following will never work:</P>
- <PRE>
- $dbh->do("INSERT INTO $table (id, name) VALUES (?, ?)",
- undef, "foo bar");
- $sth = $dbh->prepare("SELECT * FROM $table WHERE id IS NULL");
- $sth->execute();
- my($id, $name);
- $sth->bind_columns(undef, \$id, \$name);
- while ($sth->fetch) {
- printf("Found result row: id = %s, name = %s\n",
- defined($id) ? $id : "NULL",
- defined($name) ? $name : "NULL");
- }
- $sth->finish();</PRE>
- <P>The row we have just inserted, will never be returned! The reason is
- obvious, if you examine the CSV file: The corresponding row looks
- like</P>
- <PRE>
- "","foo bar"</PRE>
- <P>In other words, not a NULL is stored, but an empty string. CSV files
- don't have a concept of NULL values. Surprisingly the above example
- works, if you insert a NULL value for the name! Again, you find
- the explanation by examining the CSV file:</P>
- <PRE>
- ""</PRE>
- <P>In other words, DBD::CSV has ``emulated'' a NULL value by writing a row
- with less columns. Of course this works only if the rightmost column
- is NULL, the two rightmost columns are NULL, ..., but the leftmost
- column will never be NULL!</P>
- <P>See <A HREF="#creating and dropping tables">Creating and dropping tables</A> above for table name restrictions.</P>
- <P>
- <HR>
- <H1><A NAME="todo">TODO</A></H1>
- <P>Extensions of DBD::CSV:</P>
- <DL>
- <DT><STRONG><A NAME="item_CSV_file_scanner">CSV file scanner</A></STRONG><BR>
- <DD>
- Write a simple CSV file scanner that reads a CSV file and attempts
- to guess sep_char, quote_char, escape_char and eol automatically.
- <P></P></DL>
- <P>These are merely restrictions of the DBD::File or SQL::Statement
- modules:</P>
- <DL>
- <DT><STRONG><A NAME="item_Joins">Joins</A></STRONG><BR>
- <DD>
- The current version of the module works with single table SELECTs
- only, although the basic design of the SQL::Statement module allows
- joins and the like.
- <P></P>
- <DT><STRONG><A NAME="item_Table_name_mapping">Table name mapping</A></STRONG><BR>
- <DD>
- Currently it is not possible to use files with names like <CODE>names.csv</CODE>.
- Instead you have to use soft links or rename files. As an alternative
- one might use, for example a dbh attribute 'table_map'. It might be a
- hash ref, the keys being the table names and the values being the file
- names.
- <P></P>
- <DT><STRONG><A NAME="item_Column_name_mapping">Column name mapping</A></STRONG><BR>
- <DD>
- Currently the module assumes that column names are stored in the first
- row. While this is fine in most cases, there should be a possibility
- of setting column names and column number from the programmer: For
- example MS Access doesn't export column names by default.
- <P></P></DL>
- <P>
- <HR>
- <H1><A NAME="known bugs">KNOWN BUGS</A></H1>
- <UL>
- <LI>
- The module is using <A HREF="../../../lib/Pod/perlfunc.html#item_flock"><CODE>flock()</CODE></A> internally. However, this function is not
- available on platforms. Using <A HREF="../../../lib/Pod/perlfunc.html#item_flock"><CODE>flock()</CODE></A> is disabled on MacOS and Windows
- 95: There's no locking at all (perhaps not so important on these
- operating systems, as they are for single users anyways).
- <P></P></UL>
- <P>
- <HR>
- <H1><A NAME="author and copyright">AUTHOR AND COPYRIGHT</A></H1>
- <P>This module is Copyright (C) 1998 by</P>
- <PRE>
- Jochen Wiedmann
- Am Eisteich 9
- 72555 Metzingen
- Germany</PRE>
- <PRE>
- Email: joe@ispsoft.de
- Phone: +49 7123 14887</PRE>
- <P>All rights reserved.</P>
- <P>You may distribute this module under the terms of either the GNU
- General Public License or the Artistic License, as specified in
- the Perl README file.</P>
- <P>
- <HR>
- <H1><A NAME="see also">SEE ALSO</A></H1>
- <P><A HREF="#item_DBI">DBI(3)</A>, <A HREF="../../../Text/CSV_XS(3).html">the Text::CSV_XS(3) manpage</A>, <A HREF="../../../SQL/Statement(3).html">the SQL::Statement(3) manpage</A></P>
- <P>For help on the use of DBD::CSV, see the DBI users mailing list:</P>
- <PRE>
- <A HREF="http://www.isc.org/dbi-lists.html">http://www.isc.org/dbi-lists.html</A></PRE>
- <P>For general information on DBI see</P>
- <PRE>
- <A HREF="http://www.symbolstone.org/technology/perl/DBI">http://www.symbolstone.org/technology/perl/DBI</A></PRE>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> DBD::CSV - DBI driver for CSV files</P></STRONG>
- </TD></TR>
- </TABLE>
-
- </BODY>
-
- </HTML>
-