2016-02-24 3 views
-1

У меня есть таблица с 6 колонок и у меня есть CSV экспорт, как это с 6 записей на линиюЧтение данных из CSV и положить в базу данных

me;val1;val2;val3;val4;val5; 
me;val1;val2;val3;val4;val5; 

мне нужно прочитать эти записи и вставить его в базу данных sqlite3 .so симметричного для разбора CSV я использую

void readcsv() 
{ 
    FILE* stream = fopen("input.csv", "r"); 

    char line[1024]; 
    while (fgets(line, 1024, stream)) 
    { 
     char* tmp = strdup(line); 
     printf("Field 3 would be %s\n", getcsvfield(tmp, 3)); 
     // NOTE strtok clobbers tmp 
     free(tmp); 
    } 
} 
//Used for parsing CSV 
const char* getcsvfield(char* line, int num) 
{ 
    const char* tok; 
    for (tok = strtok(line, ";"); 
      tok && *tok; 
      tok = strtok(NULL, ";\n")) 
    { 
     if (!--num) 
      return tok; 
    } 
    return NULL; 
} 

Так будет я должен позвонить getcsvfield (TMP, fieldnumber) снова и снова в Insert Query, как это или есть чистый и эффективный способ.

execute("INSERT INTO table(a,b,c,d,e,f) VALUES('%s','%s','%s');",getcsvfield(tmp, 1),getcsvfield(tmp, 2),....... and so on 

Просьба сообщить.

+0

Первая идея могла бы иметь статическую переменную в вашем getcsvfield, который будет помнить последнюю позицию в анализируемой линии, просто чтобы не начать каждый раз и использовать 'strtok_r' с этой переменной. Вторая идея - создать функцию prepare_insert_query, которая вернет уже подготовленную «INSERT INTO table (a, b, c, d, e, f) VALUES ('val1', 'val2', 'val3'); используя конкатенацию строк внутри вместе с strtok – pikkewyn

ответ

0

Более эффективным методом является разбор строки один раз, создавая массив указателей на токены. Затем вы можете передать записи массива в функцию execute как этот

execute("INSERT INTO table(a,b,c,d,e,f) VALUES('%s','%s','%s');",token[0],token[1],... 

Вот пример, который читает строку из файла, разбивает строку на лексемы, а затем печатает маркеры.

#include <stdio.h> 
#include <string.h> 

int getTokens(char *line, char *token[], int maxt) 
{ 
    int i; 

    char *ptr = strtok(line, ";\n"); 
    for (i = 0; i < maxt; i++) 
    { 
     if (ptr == NULL) 
      return i; 

     token[i] = ptr; 
     ptr = strtok(NULL, ";\n"); 
    } 

    return i; 
} 

int main(void) 
{ 
    const int maxt = 6; 
    char line[1024]; 
    char *token[maxt]; 

    FILE *fp; 
    if ((fp = fopen("input.csv", "r")) == NULL) 
     return 1; 

    while (fgets(line, sizeof line, fp) != NULL) 
    { 
     int count = getTokens(line, token, maxt); 
     for (int i = 0; i < count; i++) 
      printf("%d: '%s'\n", i, token[i]); 
     printf("\n"); 
    } 

    fclose(fp); 
} 
+0

Спасибо ... но я продолжаю получать 'Сегментационная ошибка (ядро сбрасывается)' ' – techno

+0

Это ничего не печатает! – techno

+0

@techno Есть только две причины, чтобы не печатать ничего. A) 'fopen' вернул' NULL'. B) В файле «input.csv» ничего нет. – user3386109

Смежные вопросы