hi DAniel i had similar probme and at the end i had to build my own tool to migrate from csv to sql ...
maybe it will solve your problem too? regards e. Цитат на писмо от Daniel de Matos Alves <[EMAIL PROTECTED]>: > PLEASE, read my e-mail, i really need help ;-) > > > I am trying to import data from a file using sqlite3 > command line, and > the tcl bind. But I aways get error about the Number of > Columns. Sqlite > always says that I am trying to put less columns than the > number of > columns defined in the table. > > > I created the table using the following SQL: > > > CREATE TABLE Cliente > ( > Chave_Cliente INTEGER, > "Data Cadastro" TEXT, > Nome TEXT, > Sexo INTEGER, > Chave_Logradouro TEXT, > Endereco TEXT, > Numero TEXT, > Complemento TEXT, > Bairro TEXT, > Cidade TEXT, > Estado TEXT, > Cep TEXT, > CPF TEXT, > RG TEXT, > "Telefone Trabalho" TEXT, > "Telefone Particular" TEXT, > Email TEXT, > "Data Nascimento" TEXT, > Chave_Convenio TEXT, > Chave_Situacao TEXT, > UsuarioQueAutorizou TEXT, > "Ultima Locacao" TEXT, > "Pre pago" BOOLEAN, > Chave_PrePago TEXT, > "Validade Pre Pago" TEXT, > "Encerrou Pre Pago" BOOLEAN, > "Composicao Pre Pago" TEXT, > "Quantidade Tiquete" INTEGER, > "Consumido Tiquete" INTEGER, > "Ultima Compra Tiquete" TEXT, > "Limite Debito" TEXT, > Referencia1 TEXT, > Referencia2 TEXT, > Referencia3 TEXT, > "Fone Referencia1" TEXT, > "Fone Referencia2" TEXT, > "Fone Referencia3" TEXT, > Chave_Texto TEXT, > Observacao TEXT, > AbertaLC BOOLEAN, > LimiteLC TEXT, > DataAberturaLC TEXT, > DataEncerramentoLC TEXT, > DiaVencimentoLC INTEGER, > DataVencimentoLC TEXT, > DataUltPgtoLC TEXT, > ValorUltPgtoLC TEXT, > SaldoProximoPgtoLC TEXT, > GrupoAbriuLC TEXT, > UsuarioAbriuLC TEXT, > DataAbriuLC TEXT, > HoraAbriuLC TEXT, > GrupoEncerrouLC TEXT, > UsuarioEncerrouLC TEXT, > DataEncerrouLC TEXT, > HoraEncerrouLC TEXT, > MotivoEncerramentoLC TEXT, > "Data de Movimentacao" TEXT, > "Hora de Movimentacao" TEXT, > "Grupo usuario" TEXT, > "Usuario de grupo" TEXT, > TipoManutencao TEXT > > ); > > > I used this tcl code to import > > > db copy datafile ";" "NULL" > > > or in sqlite3 command interface > > > .import datafile.txt Cliente ";" "NULL" > > > and Here we have one line of the data file: > > > > > > 1;2005-02-13 00:00:00;FRANCISCO EDNAN SABOIA PONTES > ;0;R;NEWTON PARENTE > ;1161;PROXIMO AO COMETA > ;JANGURUSSU;FORTALEZA;CE;00000000;78928958334;94006024023;32741966;32769280 > /34724873 - PUBLICO;;1977-08-17 00:00:00;NAO > CONVENIADO;NORMAL;SUPERVISOR;2005-12-29 00:00:00;1;PRE - > PAGO LANCAMENTO > 24 HORAS;2005-04-30 > 00:00:00;0;;0;0;NULL;.0000;CELULAR-MARIA > ROSIMEIRE;TIO- CELSO;;8861-5632;3276-1949;;CONTRATO DE > LOCACAO;;0;.0000;NULL;NULL;0;NULL;NULL;.0000;.0000;;;NULL;NULL;;;NULL;NULL;;2005-12-29 > 00:00:00;1899-12-30 > 17:08:25;ADMINISTRA??O;ANGELA;ALTERACAO > > > ----------------------------- Спортни залагания! bg.sportingbet.com
// ivandimitrov #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys\stat.h> #include <time.h> char separator = ','; char quotes = '\"'; int scanCSV(const char *fn) { FILE *stream; int line, pos, maxpos; int flg = 0; char buff[5*1024]; int i, n = sizeof(buff); stream = fopen(fn, "rt"); if (!stream) return -1; maxpos=0; for (line=0;!feof(stream);++line) { fgets(buff, n, stream); for (pos=0, i=0;i<n && buff[i] != 10 && buff[i] != 13 && buff[i] != 0;++i) { if (buff[i] == quotes) { if (flg) { flg = 0; } else { flg = 1; } } if (flg == 0 && buff[i] == separator) ++pos; } if (flg == 0 ) ++pos; if (pos > maxpos) { maxpos = pos; } //printf("pos=%d\n", pos); } fclose(stream); return maxpos; } static char * RemoveTraillingSpaces(char *s) { int n, i; n = strlen(s); for (i=n-1;i>=0;++i) if (s[i] == ' ') { s[i] = 0; } else { break; } return s; } char *removespaces(char *s) { RemoveTraillingSpaces(s); strrev(s); RemoveTraillingSpaces(s); strrev(s); return s; } int isBlank(char *s) { for (;*s;++s) { if (*s != ' ') { return 0; } } return 1; } //#define display() {ix = i+1;++pos;for (j=old;j<i;++j) {word[j-old] = buff[j];} word[j-old] = 0;printf(" +++ %d %s\n", pos, word);old = ix;} #define display() \ { \ ix = i+1; \ ++pos; \ for (j=old;j<i;++j) \ { \ char *p = &word[j-old];\ *p = buff[j]; \ } \ word[j-old] = 0;\ if (pos > 0) \ strcat(cout, " ,"); \ removespaces(word); \ if (i==old || isBlank(word)) \ strcat(cout, "NULL"); \ else \ { \ strcat(cout, "\'");\ strcat(cout, word); \ strcat(cout, "\'");\ } \ old = ix; \ } int processCSV(const char *fn, const char *tbablename, int maxpos) { FILE *stream; int line, pos, ix; int flg = 0; char buff[5*1024]; char word[1024]; int i, j, n = sizeof(buff), old; char cout[10*1024]; stream = fopen(fn, "rt"); if (!stream) return -1; old = 0; for (line=1;!feof(stream);++line) { fgets(buff, n, stream); old = 0; *cout = 0; sprintf(cout, "%u", line); for (pos=0, ix = i=0;i<n && buff[i] != 10 && buff[i] != 13 && buff[i] != 0;++i) { if (buff[i] == quotes) { if (flg) { flg = 0; } else { flg = 1; } } if (flg == 0 && buff[i] == separator) { display(); } } if (flg == 0) { display(); for (;pos < maxpos;++pos) { strcat(cout, ", NULL"); } } printf("INSERT INTO %s VALUES(%s);\n", tbablename, cout); //printf("pos=%d\n", pos); } fclose(stream); return maxpos; } int preambule(const char *tbablename, int fields) { int i; printf("CREATE TABLE %s(", tbablename); printf("excelid"); for (i=1;i<=fields; ++i) { if (i>0) printf(", "); printf("field%u", i); } printf(");\n\n"); return i; } /* strtok */ int cvstosql(const char *filename, const char *tablename) { int mp; struct stat statbuf; time_t timer; //struct tm *tblock; /* gets time of day */ timer = time(NULL); /* converts date/time to a structure */ //tblock = localtime(&timer); // get information about the file stat(filename, &statbuf); printf("-- CVS to SQL [adimiti]: %s\n", __FILE__ " " __DATE__ " " __TIME__); printf("-- file: %s\n", filename); printf("-- from %s", ctime(&statbuf.st_ctime)); mp = scanCSV(filename); if (mp<0) { fprintf(stderr, "Error opening %s\n", filename); return mp; } printf("-- quotes: %c\n", quotes); printf("-- separator: %c\n", separator); printf("-- table: %s\n", tablename); printf("-- created: %s", ctime(&timer) ); //printf("-- created: %s", asctime(tblock)); printf("-- felds: %d\n", mp); printf("BEGIN TRANSACTION;\n"); preambule( tablename, mp); processCSV( filename, tablename, mp); printf("COMMIT;\n"); return 0; } // void test(void) { cvstosql("sample.csv","tbl"); } int main(int argc, char *argv[]) { // test(); if (argc > 4) quotes = *argv[4];; if (argc > 3) separator = *argv[3]; if (argc > 2) { cvstosql(argv[1], argv[2]); } else { fprintf(stderr, "This program converts CSV-file to SQL(stdout)\nParams: csv-file table-name [separator [quotes]]\n"); return -1; } return 0; }