如何使用C解析CSV文件中的每一列

时间:2019-02-21 06:42:54

标签: c parsing

我正在尝试使用C读取CSV文件,逐行进行迭代(直到EOF),并用逗号分隔/分隔每行。然后,我希望根据类型将每一列分成“ bins”,然后将它们添加到结构(此处未显示;我在帮助文件中定义)中。

例如,如果我有1,Bob,我想将1Bob分成两个变量。这是我到目前为止写的。

void readFile(char file[25]) {
    FILE *fp;
    char line[1000];

    fp = fopen(file, "r"))

    while(fgets(line, 1000, fp)) {
        char* tmp = strdup(line);
        char* token;

        while((token = strsep(&tmp, ","))) {
            printf("%s\n", token);  // I want to split token[0] and token[1]
        }
    }
    fclose(fp);
}

以上代码确实可以编译和运行。我只是不知道如何访问token的各个部分,例如token[0]token[1]。在python中,这将足够简单。对于每个1,我都可以使用token[0]访问Bob,并使用token[1]访问line。但是在C语言中,我无法做到这一点。

出于测试目的,我现在要做的是打印每一行(在第二个while循环中),只是为了查看每个拆分的外观。我尚未实现将每条分割线放入其相应的struct成员的代码。

我已经搜索了Stack Overflow,并找到了关于该主题的多个线程。除了我从中汲取的this one之外,他们似乎都没有帮助我。但是我无法使拆分列的存储正常工作。

1 个答案:

答案 0 :(得分:1)

  

在python中,这很简单。对于每个1,我都可以使用token[0]访问Bob,并使用token[1]访问line。但是在C语言中,我无法做到这一点。

是的,只要定义数组就可以。

    while (fgets(line, sizeof line, fp))
    {
        char *tmp = strchr(line, '\n');
        if (tmp) *tmp = '\0';   // remove the '\n'
        tmp = strdup(line);
        #define MAXCOLUMNS  2
        char *token[MAXCOLUMNS];
        int c = 0;
        while (tmp)
        {
            if (c == MAXCOLUMNS) puts("too many columns"), exit(1);
            token[c++] = strsep(&tmp, ",");
        }
        if (1 <= c) printf("column 1: %s\n", token[0]);
        if (2 <= c) printf("column 2: %s\n", token[1]);
        // ONLY if the line's tokens are no longer needed:
        free(*token);
    }