首页 > 解决方案 > 如何使用 C 解析 CSV 文件中的每一列

问题描述

我正在尝试使用 C 来读取 CSV 文件,逐行迭代(直到 EOF),并用逗号分隔/分割每一行。然后我希望将每一列分成“bins”并将它们添加到基于类型的结构(这里没有显示;我在帮助文件中定义它)。

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

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, liketoken[0]token[1]. 在 python 中,这很简单。我可以访问1usingtoken[0]Bobusing token[1]for each line。但是在C语言中,我不能这样做。

出于测试目的,我现在所做的只是打印每一行(在第二个while循环中),只是为了看看每个拆分的外观。我还没有实现将每个分割线放入其各自结构成员的代码。

我搜索了 Stack Overflow 并发现了很多关于这个主题的主题。除了我从中汲取的这个之外,它们似乎都没有帮助我。但我无法让拆分列的存储工作。

标签: cparsing

解决方案


在 python 中,这很简单。我可以访问1usingtoken[0]Bobusing token[1]for each 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);
    }

推荐阅读