c - 解析缺少条目的 csv 文件

标签 c parsing csv

我正在尝试使用 strtok 用 C 解析一个 csv 文件,其中分隔符是 |。问题是有些字段是空的,因此两个分隔符彼此相邻放置。似乎 strtok 只是跳过所有空字段,只是输出下一个非空字段。

问题是我需要知道正在读取的 token 属于哪个位置。

这里有一个非常小的例子来说明。

文件

node|171933|||traffic_signals|||||40.4200658|-3.7016652

例如这一行有 10 个字段,但只有字段 1、2、9 和 10 在其中有一些值。

代码

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

void main()
{
    FILE *fp;
    char lineBuf[128];
    char *token;
    int i=0;

    if((fp = fopen("test.txt", "r"))==NULL){
      fprintf (stderr, "\nError when opening file\n");
      return ;
    }

    fgets (lineBuf, sizeof(lineBuf), fp);

    token=strtok(lineBuf, "|\n");
    while(token!=NULL){
      printf("Element %d: %s\n",i,token); i++;
      token=strtok(NULL, "|\n");
    }
}

输出

Element 0: node
Element 1: 171933
Element 2: traffic_signals
Element 3: 40.4200658
Element 4: -3.7016652

预期输出

Element 0: node
Element 1: 171933
Element 4: traffic_signals
Element 9: 40.4200658
Element 10: -3.7016652

有没有其他方法可以按预期解析这样的一行?一行中的元素数量之前没有定义。

我已经知道 strtok 显示的行为是通常的行为我只是要求另一种方法来获得所需的结果,而不是解释为什么会发生这种情况。

最佳答案

我不确定您使用的是什么平台,但 strsep() 是您尝试执行的操作的推荐替代品。

男人 strsep

while (fgets(buf, BUFSIZE, fp) != NULL) {
    char *line  = buf;
    char *field;
    int index = 0;
    while ((field = strsep(&line, "|")) != NULL) {
        /* note the trailing field will contain newline. */
        printf("element %d = %s\n", index, field);
        index++;
   }
}

关于c - 解析缺少条目的 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20302014/

相关文章:

java - 在Java中将字符串转换为日期并根据当前日期进行排序。

csv - 根据列的值删除 CSV 文件的行

python - 元组列表转为 CSV

c - 退格字符被添加到 FIFO 中

c - 编程前后增量

c++ - 用空格替换 std::string 中的特定字符

javascript - 从 csv、xml 或 json 中存储的数据生成 HTML 代码

c - 如何重新加载 C 程序?

c++ - 无法 `open` 文件,但 `lseek` 已完成且没有错误

python - 解析存储在 pandas 数据框列中的推文