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