我正在尝试使用 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/