c - 如何使用 C 解析 CSV 文件中的每一列
问题描述
我正在尝试使用 C 来读取 CSV 文件,逐行迭代(直到 EOF),并用逗号分隔/分割每一行。然后我希望将每一列分成“bins”并将它们添加到基于类型的结构(这里没有显示;我在帮助文件中定义它)。
例如,如果我有1,Bob
,我想将1
和拆分Bob
为两个变量。这是我到目前为止所写的。
void readFile(char file[25]) {
FILE *fp;
char line[1000];
fp = fopen(file, "r"))
while(fgets(line, 1000, fp)) {
char* tmp = strdup(line);
char* token;
while((token = strsep(&tmp, ","))) {
printf("%s\n", token); // I want to split token[0] and token[1]
}
}
fclose(fp);
}
上面的代码确实编译并运行。我只是不知道如何访问token
, liketoken[0]
或token[1]
. 在 python 中,这很简单。我可以访问1
usingtoken[0]
和Bob
using token[1]
for each line
。但是在C语言中,我不能这样做。
出于测试目的,我现在所做的只是打印每一行(在第二个while
循环中),只是为了看看每个拆分的外观。我还没有实现将每个分割线放入其各自结构成员的代码。
我搜索了 Stack Overflow 并发现了很多关于这个主题的主题。除了我从中汲取的这个之外,它们似乎都没有帮助我。但我无法让拆分列的存储工作。
解决方案
在 python 中,这很简单。我可以访问
1
usingtoken[0]
和Bob
usingtoken[1]
for eachline
。但是在C语言中,我不能这样做。
是的,你可以,只要你定义数组。
while (fgets(line, sizeof line, fp))
{
char *tmp = strchr(line, '\n');
if (tmp) *tmp = '\0'; // remove the '\n'
tmp = strdup(line);
#define MAXCOLUMNS 2
char *token[MAXCOLUMNS];
int c = 0;
while (tmp)
{
if (c == MAXCOLUMNS) puts("too many columns"), exit(1);
token[c++] = strsep(&tmp, ",");
}
if (1 <= c) printf("column 1: %s\n", token[0]);
if (2 <= c) printf("column 2: %s\n", token[1]);
// ONLY if the line's tokens are no longer needed:
free(*token);
}
推荐阅读
- python - 为什么 ImageFilter.BoxBlur 给出错误的结果?
- javascript - 结果不会显示在异步函数的空数组中
- javascript - 为什么在监视模式下运行时 Terser 最小化器不会删除空格和换行符?
- enums - 在传递带有向量的文件时,如何在测试台中使用枚举?
- ios - 无法归档 SwiftUI 项目,入口点 (_main) 未定义。用于架构 arm64
- css - 盒子应该是垂直薄的,没有足够的内容,但是当内容太多时会有滚动条
- nginx - 为什么我的 nginx 即服务在 windows server 2016 中不起作用
- r - 如何使用 R 中的 fixst 删除一个固定效果?
- javascript - 从子元素设置父样式
- javascript - 在 Slate.js 编辑器中启用自动链接