【发布时间】:2017-08-29 17:55:13
【问题描述】:
我有一个 CSV 数据文件,其中包含以下数据:
H1,H2,H3
a,"b
c
d",e
当我通过 Excel 作为 CSV 文件打开时,它能够显示列标题为 H1, H2, H3 和列值为:a for H1 的工作表,
multi line value as
b
c
d
for H2
和c for H3
我需要使用 C 程序解析这个文件并像这样获取值。
但是,我的以下代码 sn-p 将不起作用,因为我有一列有多行值:
char buff[200];
char tokens[10][30];
fgets(buff, 200, stdin);
char *ptok = buff; // for iterating
char *pch;
int i = 0;
while ((pch = strchr(ptok, ',')) != NULL) {
*pch = 0;
strcpy(tokens[i++], ptok);
ptok = pch+1;
}
strcpy(tokens[i++], ptok);
如何修改这段代码 sn-p 以适应列的多行值? 请不要被字符串缓冲区的硬编码值所困扰,这是 POC 的测试代码。 而不是任何第 3 方库,我想从第一原则开始艰难地做到这一点。 请帮忙。
【问题讨论】:
-
解析 CSV 文件看似简单,因为有许多难以记住处理的特殊情况。或者只是很难处理。例如,如果多行字符串包含逗号怎么办?尝试找到一个可以为您处理它的库。
-
对于初学者来说,您应该考虑制作它,以便您的代码可以在额外的行中读取,并且
buff可以是任意大小,而不是限制为 199 个字符。 -
请不要被字符串缓冲区的硬编码值所困扰,这是作为 POC 的测试代码。而不是任何第 3 方库,我想从第一原则开始努力
-
如果你想自己做这一切,那么从创建大量单元测试开始,这样你就可以确定当你完成时它是正确的。那么对于实际的解析,其实还是要对内容做一些解析,不能只逐行读取,然后用
strtok来拆分内容。我建议使用更大的缓冲区并读入它。然后逐个字符处理,处理逗号(不在字符串中时)并处理字符串和可能的转义。当你找到他们时。 -
在stackoverflow.com/questions/32349263/… 中,我在C 中提供了一个基本的CSV 解析器。如果换行符在带引号的字符串中,它们将被复制到正在解析的字段中。
标签: c excel csv parsing strchr