簡體   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