我有一个包含数据的CSV文件
value;name;test;etc
Run Code Online (Sandbox Code Playgroud)
我试图通过使用分裂strtok(string, ";")
.但是,此文件可以包含零长度数据,如下所示:
value;;test;etc
Run Code Online (Sandbox Code Playgroud)
其strtok()
跳过.有没有办法可以避免strtok
像这样跳过零长度数据?
可能的替代方法是使用BSD功能strsep()
而不是(strtok()
如果可用).从手册页:
该
strsep()
功能旨在替代该strtok()
功能.虽然strtok()
出于可移植性原因该函数应该是首选的(它符合ISO/IEC 9899:1990("ISO C90"))但是它无法处理空字段,即检测由两个相邻分隔符字符分隔的字段,或者用于一次不止一个字符串.该strsep()
功能首次出现在4.4BSD中.
一个简单的例子(也从该手册页复制):
char *token, *string, *tofree;
tofree = string = strdup("value;;test;etc");
while ((token = strsep(&string, ";")) != NULL)
printf("token=%s\n", token);
free(tofree);
Run Code Online (Sandbox Code Playgroud)
输出:
token=value token= token=test token=etc
所以空字段处理正确.
当然,正如其他人已经说过的,这些简单的tokenizer函数都没有正确处理引号内的分隔符,所以如果这是一个问题,你应该使用一个合适的 CSV解析库.
归档时间: |
|
查看次数: |
6453 次 |
最近记录: |