【发布时间】:2017-04-26 21:46:12
【问题描述】:
我有一个 .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 列。
我正在尝试将这些条目转换为二维数组,以便随后可以操作数据。您会注意到,在我的示例中,我只是设置了一个小的 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;
}
它只打印“空”错误,我相信我犯了与这一行的指针有关的错误:A[i][j] = getfield(tmp, j)。我只是不确定如何解决这个问题。
这项工作几乎完全基于这个问题:Read .CSV file in C。非常感谢您在适应此问题方面的任何帮助,因为自从我上次接触 C 或外部文件以来已经有几年了。
【问题讨论】:
-
1)
int A[10][10];-->const char *A[10][10]; -
getfield()不会进行任何复制,它只是切碎并返回tmp的一部分。然后将tmp的那部分分配给矩阵中的一个位置,然后释放tmp。 (正如@BLUEPIXY 指出的那样,它甚至没有被定义为保存字符串)如果你要将指针存储在A中,你必须保持它们的分配状态,直到你完成它们作为初学者。 (我还没有读过这行代码,所以可能会有更多……) -
3)
if (!--num)-->if (!num--) -
4) 您需要重置
j。喜欢j = 0; while(j<10){或使用for -
@ebyrob 基本上这些问题大多是题外话。
标签: c arrays csv parsing pointers