[英]Reading data from CSV file in c
我正在尝试从 CSV 文件中读取数据并希望以某种格式输出。 我有大约 200 行数据和 7 个变量。
使用我的代码,我得到以下输出(这只是第一行;我应该有 200 个):
1880
3.9
0.91
115.7
4.1
45
0.03
编码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE *file = fopen("data.csv", "r");
char buf[199];
float V2, V3, V4,V5, V7;
int V1, V6;
while(fgets(buf, sizeof(buf), file))
{
sscanf(buf,"%d, %f,%f,%f,%f,%d,%f",
&V1, &V2, &V3, &V4, &V5, &V6, &V7);
printf("\n%d\n%f\n%f\n%f\n%f\n%d\n%f\n", V1, V2, V3, V4, V5, V6, V7);
}
printf("\n");
return 0;
}
这段代码有效并给出了我上面提到的输出。
我希望输出像,
sample[0][0]= 1880;sample[0][1]= 3.9 ;sample[0][2]= 0.91;sample[0][3]= 115.7;sample[0][4]= 4.1 ;sample[0][5]= 45;sample[0][6]= 0.03
这就是你得到的输出,因为那是你编码的输出。
printf("\n%d\n%f\n%f\n%f\n%f\n%d\n%f\n", V1, V2, V3, V4, V5, V6, V7);
要获得您想要的输出,您需要进行两次更改。 首先,您需要更改要打印的内容。 其次,您需要保持行数。
首先,请务必检查您的文件是否已打开。
FILE *file = fopen("data.csv", "r");
if( file == NULL ){
perror("data.csv");
exit(1);
}
我们可以通过使用for
循环而不是while
循环来保持行数。 注意我将缓冲区大小提高到 1k,从文件中读取行时没有理由吝啬。
char buf[1024];
for(
int row = 0;
fgets(buf, sizeof(buf), file);
row++
) {
然后我们肯定会错误检查我们是否正确解析了一行。
int result = sscanf(buf,"%d, %f,%f,%f,%f,%d,%f", &V1, &V2, &V3, &V4, &V5, &V6, &V7);
if( result != 7 ) {
fprintf(stderr, "Could not parse line %d '%s'\n", row, buf);
continue;
}
现在我们可以打印你想要的东西了。 正如@Jonathan Leffler 建议的那样,我们使用%g
,它类似于%f
但它会剪掉尾随零。
printf("sample[%d][0]=%d; sample[%d][1]=%g; sample[%d][2]=%g;... and so on...\n", row, V1, row, V2, row, V3);
您需要使所有 V 变量相同(float 或 int),因为它将用于填充二维数组(当然 1 个数组只能定义为 1 种类型的数据类型)。 这里我将使用浮点数据类型作为二维数组。 (我将您的 Vx 变量更改为 aray)。
float V[7];
float sample[200][7];
int row, column;
row=column=0;
while(fgets(buf, sizeof(buf), file))
{
sscanf(buf,"%f,%f,%f,%f,%f,%f,%f", &V[0], &V[1], &V[2], &V[3], &V[4], &V[5], &V[6]);
for(column=0; column<7; column++) sample[row][column]=V[column];
printf("\nsmaple[%d][%d]: %f\nsmaple[%d][%d]: %f\nsmaple[%d][%d]: %f\nsmaple[%d][%d]: %f\nsmaple[%d][%d]: %f\nsmaple[%d][%d]: %f\nsmaple[%d][%d]: %f\n", row, column, V[0], row, column, V[1], row, column, V[2], row, column, V[3], row, column, V[4], row, column, V[5], row, column, V[6]);
row++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.