解析缺少条目的 csv 文件

Jes*_*Ros 5 c csv parsing

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

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

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

文件

node|171933|||traffic_signals|||||40.4200658|-3.7016652
Run Code Online (Sandbox Code Playgroud)

例如,这一行有 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

Element 0: node
Element 1: 171933
Element 2: traffic_signals
Element 3: 40.4200658
Element 4: -3.7016652
Run Code Online (Sandbox Code Playgroud)

预期产出

Element 0: node
Element 1: 171933
Element 4: traffic_signals
Element 9: 40.4200658
Element 10: -3.7016652
Run Code Online (Sandbox Code Playgroud)

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

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

cod*_*der 4

我不确定你在哪个平台上,但 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++;
   }
}
Run Code Online (Sandbox Code Playgroud)