C語言讀取csv文件
在做中興挑戰賽時,需要讀取csv文件,當時不知道有沒有現成的函數調用,所以自己寫了一個C語言讀取csv文件的函數,沒有測試過性能,后來用matlab實現了挑戰賽,所以就沒有用C語言,貼出來希望如果有大佬的話指教一二
逗號分隔值(Comma-Separated Values,CSV,有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味着該文件是一個字符序列,不含必須像二進制數字那樣被解讀的數據。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。建議使用WORDPAD或是記事本來開啟,再則先另存新檔后用EXCEL開啟,也是方法之一。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int get_row(char *filename);
int get_col(char *filename);
void get_relationship(int** data, char* filename, int col);
void main()
{
char filename[] = "./Example.csv";
int row, col;
row = get_row(filename);
col = get_col(filename);
printf("row = %d, col = %d\n", row, col);
int **data;
data = (int **)malloc(row * sizeof(int *));
for(int i=0; i<row; i=i+1)
{
data[i] = (int *)malloc(col * sizeof(int));
}
get_relationship(data, filename, col);
printf("\nhello");
}
int get_row(char *filename)
{
FILE* stream = fopen(filename, "r");
int i = 0;
while(fgetc(stream) != EOF)
{
if(fgetc(stream) == '\n')
{
i++;
}
}
fclose(stream);
return i;
}
int get_col(char *filename)
{
FILE* stream = fopen(filename, "r");
int i = 0;
int x;
while((x = fgetc(stream)) != '\n')
{
if(x == ',')
{
i++;
}
}
fclose(stream);
return i+1;
}
void get_relationship(int** data, char* filename, int col)
{
FILE* stream = fopen(filename, "r");
char line[2*col+1];
int i = 0;
while (fgets(line, 2*col+1, stream))
{
int j = 0;
char *tok;
char* tmp = strdup(line);
for (tok = strtok(line, ","); tok && *tok; j++, tok = strtok(NULL, ",\n"))
{
data[i][j] = atof(tok);
}
i++;
free(tmp);
}
fclose(stream);
}