我有一个类似于以下格式的 .csv 文件:
SKU,Plant,Qty
40000,ca56,1245
40000,ca81,12553.3
40000,ca82,125.3
45000,ca62,0
45000,ca71,3
45000,ca78,54.9
注意:这只是我的示例,但实际上有大约500,000行和3列。
我试图将这些条目转换为2D数组,以便我可以操纵数据。您会注意到,在我的示例中,我只设置了一个小的10x10矩阵A,以尝试使此示例正常工作,然后再转向真正的数据。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *getfield(char *line, int num);
int main() {
FILE *stream = fopen("input/input.csv", "r");
char line[1000000];
int A[10][10];
int i, j = 0;
//Zero matrix
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
A[i][j] = 0;
}
}
for (i = 0; fgets(line, 1000000, stream); i++) {
while (j < 10) {
char *tmp = strdup(line);
A[i][j] = getfield(tmp, j);
free(tmp);
j++;
}
}
//print matrix
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
printf("%s\t", A[i][j]);
}
printf("\n");
}
}
const char *getfield(char *line, int num) {
const char *tok;
for (tok = strtok(line, ",");
tok && *tok;
tok = strtok(NULL, ",\n"))
{
if (!--num)
return tok;
}
return 0;
}
它仅打印“null”错误,我认为这与此行的指针有关:
A [i] [j] = getfield(tmp,j)
。但我真的不确定如何修正它。这项工作几乎完全基于这个问题: 在C中读取.CSV文件。非常感谢任何帮助来适应它,因为距上次接触C或外部文件已经过去了几年。
getfield()
不会复制任何内容,它只是将tmp
的一部分切割并返回。然后你将tmp
的那部分赋值给矩阵中的一个位置,然后释放tmp
。(正如 @BLUEPIXY 指出的,tmp
甚至没有定义为保存字符串)如果你要在A
中存储指针,你必须保持它们分配直到你完成使用它们为止。(我还没有读过这行代码之后的内容,所以可能还有更多要来...) - ebyrobif (!--num)
-->if (!num--)
- BLUEPIXYj
。像这样j = 0; while(j<10){
或者使用for
。