dbf2pg - Insert xBase-style .dbf-files into a PostgreSQL-table
authorBruce Momjian
Thu, 31 Jul 2003 02:12:43 +0000 (02:12 +0000)
committerBruce Momjian
Thu, 31 Jul 2003 02:12:43 +0000 (02:12 +0000)
  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

contrib/dbase/README.dbf2pg
contrib/dbase/dbf2pg.1
contrib/dbase/dbf2pg.c

index 7203be4029b14de0984edc28e25ebb1dd13c938a..715481965506072dd47dc78c7b578ee519c97ddd 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
        "dbf2pg [options] dbf-file"
        Options:
        [-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]
        [-F charset_from [-T charset_to]]
 
@@ -70,15 +70,19 @@ DESCRIPTION
 dbf2sql(1L)                          dbf2sql(1L)
 
 
-       -s oldname=newname[,oldname=newname]
+       -s oldname=[newname][,oldname=[newname]]
          Change the name of a field from oldname to newname.
          This  is  mainly  used to avoid using reserved SQL-
-         keywords. Example:
-         -s SELECT=SEL,COMMIT=doit
+         keywords.  When the new fieldname is empty, the field
+         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
          effect!
 
-       -s start
+       -b start
          Specify  the  first record-number in the xBase-file
          we will insert.
 
index a377e489c831f049db7280e4154c312dff3ea910..e62d3323b59cefe525e68ce861097c0bb50d8a05 100644 (file)
@@ -8,8 +8,8 @@ dbf2sql \- Insert xBase\-style .dbf\-files into a PostgreSQL\-table
 Options:
 .br
 [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
-[-h host] [-s oldname=newname[,oldname=newname]]
-[-s start] [-e end] [-W] [-U username] [-B transaction_size]
+[-h host] [-s oldname=[newname][,oldname=[newname]]]
+[-b start] [-e end] [-W] [-U username] [-B transaction_size]
 [-F charset_from [-T charset_to]]
 
 .SH DESCRIPTION
@@ -78,7 +78,7 @@ the
 .IR -f
 operator has taken effect!
 .TP
-.I "-s start"
+.I "-b start"
 Specify the first record-number in the xBase-file we will insert.
 .TP
 .I "-e end"
index b57b5c76885c392100e0b1bff976ec58e805de61..0ae53cd126d48a51426dcd134c590d98cd9d3655 100644 (file)
@@ -194,7 +194,7 @@ usage(void)
    printf("dbf2pg\n"
           "usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\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");
 }
 
@@ -359,6 +359,7 @@ do_inserts(PGconn *conn, char *table, dbhead * dbh)
    field      *fields;
    int         i,
                h,
+               j,
                result;
    char       *query,
               *foo;
@@ -442,12 +443,19 @@ do_inserts(PGconn *conn, char *table, dbhead * dbh)
        if (result == DBF_VALID)
        {
            query[0] = '\0';
+           j = 0; /* counter for fields in the output */
            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;
+               }
+               else
+               {
+                   j++;
+               }
 
-               if (h != 0)     /* not for the first field! */
+               if (j > 1)      /* not for the first field! */
                    strcat(query, "\t");        /* COPY statement field
                                                 * separator */