dbf2pg - Insert xBase-style .dbf-files into a PostgreSQL-table

There is an option "-s oldname=newname", which changes the old field name of
  the dbf-file to the newname in PostgeSQL. If the length of the new name is 0,
  the field is skiped. If you want to skip the first field of the dbf-file,
  you get the wildest error-messages from the backend.
  dbf2pg load the dbf-file via "COPY tablename FROM STDIN". If you skip the
  first field, it is an \t to much in STDIN.

A fix could be an counter j=0, which increments only, if a field is imported
(IF (strlen(fields[h].db_name)> 0) j++. And only if j > 1 (if an other field is
imported) the \t is printed.

An other small bug in the README:
-s start
              Specify  the  first record-number in the xBase-file
              we will insert.
should be
-e start
              Specify  the  first record-number in the xBase-file
              we will insert.

Thomas Behr
This commit is contained in:
Bruce Momjian 2003-07-31 02:12:43 +00:00
parent 52347b6637
commit 82bade79dc
3 changed files with 23 additions and 11 deletions

View File

@ -12,7 +12,7 @@ SYNOPSIS
"dbf2pg [options] dbf-file" "dbf2pg [options] dbf-file"
Options: Options:
[-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table] [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
[-h host] [-s oldname=newname[,oldname=newname]] [-s [-h host] [-s oldname=[newname][,oldname=[newname]]] [-b
start] [-e end] [-W] [-U username] [-B transaction_size] start] [-e end] [-W] [-U username] [-B transaction_size]
[-F charset_from [-T charset_to]] [-F charset_from [-T charset_to]]
@ -70,15 +70,19 @@ DESCRIPTION
dbf2sql(1L) dbf2sql(1L) dbf2sql(1L) dbf2sql(1L)
-s oldname=newname[,oldname=newname] -s oldname=[newname][,oldname=[newname]]
Change the name of a field from oldname to newname. Change the name of a field from oldname to newname.
This is mainly used to avoid using reserved SQL- This is mainly used to avoid using reserved SQL-
keywords. Example: keywords. When the new fieldname is empty, the field
-s SELECT=SEL,COMMIT=doit is skipped in both the CREATE-clause and the
INSERT-clauses, in common words: it will not be present
in the SQL-table.
Example:
-s SELECT=SEL,remark=,COMMIT=doit
This is done before the -f operator has taken This is done before the -f operator has taken
effect! effect!
-s start -b start
Specify the first record-number in the xBase-file Specify the first record-number in the xBase-file
we will insert. we will insert.

View File

@ -8,8 +8,8 @@ dbf2sql \- Insert xBase\-style .dbf\-files into a PostgreSQL\-table
Options: Options:
.br .br
[-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table] [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
[-h host] [-s oldname=newname[,oldname=newname]] [-h host] [-s oldname=[newname][,oldname=[newname]]]
[-s start] [-e end] [-W] [-U username] [-B transaction_size] [-b start] [-e end] [-W] [-U username] [-B transaction_size]
[-F charset_from [-T charset_to]] [-F charset_from [-T charset_to]]
.SH DESCRIPTION .SH DESCRIPTION
@ -78,7 +78,7 @@ the
.IR -f .IR -f
operator has taken effect! operator has taken effect!
.TP .TP
.I "-s start" .I "-b start"
Specify the first record-number in the xBase-file we will insert. Specify the first record-number in the xBase-file we will insert.
.TP .TP
.I "-e end" .I "-e end"

View File

@ -194,7 +194,7 @@ usage(void)
printf("dbf2pg\n" printf("dbf2pg\n"
"usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\n" "usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\n"
" [-B transaction_size] [-F charset_from [-T charset_to]]\n" " [-B transaction_size] [-F charset_from [-T charset_to]]\n"
" [-s oldname=newname[,oldname=newname[...]]] [-d dbase]\n" " [-s oldname=[newname][,oldname=[newname][...]]] [-d dbase]\n"
" [-t table] [-c | -D] [-f] [-v[v]] dbf-file\n"); " [-t table] [-c | -D] [-f] [-v[v]] dbf-file\n");
} }
@ -359,6 +359,7 @@ do_inserts(PGconn *conn, char *table, dbhead * dbh)
field *fields; field *fields;
int i, int i,
h, h,
j,
result; result;
char *query, char *query,
*foo; *foo;
@ -442,12 +443,19 @@ do_inserts(PGconn *conn, char *table, dbhead * dbh)
if (result == DBF_VALID) if (result == DBF_VALID)
{ {
query[0] = '\0'; query[0] = '\0';
j = 0; /* counter for fields in the output */
for (h = 0; h < dbh->db_nfields; h++) for (h = 0; h < dbh->db_nfields; h++)
{ {
if (!strlen(fields[h].db_name)) if (!strlen(fields[h].db_name)) /* When the new fieldname is empty, the field is skipped */
{
continue; continue;
}
else
{
j++;
}
if (h != 0) /* not for the first field! */ if (j > 1) /* not for the first field! */
strcat(query, "\t"); /* COPY statement field strcat(query, "\t"); /* COPY statement field
* separator */ * separator */