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