我有一个包含数据的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 次 |
| 最近记录: |