繁体   English   中英

从c中的CSV文件读取数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM