【问题标题】:Read Data from CSV and Put into Database从 CSV 读取数据并放入数据库
【发布时间】: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

标签: c database csv sqlite


【解决方案1】:

更有效的方法是解析该行一次,创建一个指向标记的指针数组。然后,您可以像这样将数组条目传递给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 );
}

【讨论】:

  • 谢谢...但我不断收到Segmentation fault (core dumped)'
  • 这不打印任何东西!
  • @techno 它不打印任何东西只有两个原因。 A) fopen 返回NULL。 B)文件“input.csv”中没有任何内容。
猜你喜欢
  • 2013-02-10
  • 2019-05-17
  • 2019-05-15
  • 2018-02-19
  • 1970-01-01
  • 2016-07-08
  • 2013-10-10
  • 1970-01-01
  • 2012-08-10
相关资源
最近更新 更多