【发布时间】:2016-02-24 05:34:07
【问题描述】:
我有一个有 6 列的表格,我有这样的 CSV 导出,每行有 6 个条目
me;val1;val2;val3;val4;val5;
me;val1;val2;val3;val4;val5;
我需要阅读这些条目并将其插入 SQLITE3 数据库。所以为了解析我使用的 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) 还是有更清洁和有效的方法。
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