C語言讀取CSV檔案的方法1
阿新 • • 發佈:2019-01-23
1、字串處理中的 strtok() 函式
它以 ct 中的字元為分界符,將字串 s 分成許多記號。第一次呼叫時,它搜尋 s ,找到不包含ct的第一個記號,將 s 中的下一個字元替換為 ‘/0’ ,並返回指向記號的指標。隨後呼叫 strtok 函式時(由 s 的值是否為NULL指示),返回下一個不包含 ct 中字元的記號。當 s 中沒有這樣的記號時,返回NULL 。每次呼叫時的 ct 可以不同。
下面這段程式碼演示了這個函式的使用(假設以逗號為分隔符):
執行上述程式碼,輸出結果如下:
我們首先來介紹C語言標準庫中的一個非常有用的字串處理函式 strtok(),該函式位於標頭檔案string.h中,它的原型是:
char *strtok( char *s, const char *ct );
它以 ct 中的字元為分界符,將字串 s 分成許多記號。第一次呼叫時,它搜尋 s ,找到不包含ct的第一個記號,將 s 中的下一個字元替換為 ‘/0’ ,並返回指向記號的指標。隨後呼叫 strtok 函式時(由 s 的值是否為NULL指示),返回下一個不包含 ct 中字元的記號。當 s 中沒有這樣的記號時,返回NULL 。每次呼叫時的 ct 可以不同。
下面這段程式碼演示了這個函式的使用(假設以逗號為分隔符):
#include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { char str[] = "The United States of America,New Zealand,Australia,Republic of Korea"; char delims[] = ","; char *result = NULL; result = strtok( str, delims ); while( result != NULL ) { printf("%s\n", result); result = strtok( NULL, delims ); } return 0; }
執行上述程式碼,輸出結果如下:
The United States of America
New Zealand
Australia
Republic of Korea
逗號分隔值檔案格式(CSV,Comma-Separated Values),有時也稱為字元分隔值,因為分隔字元也可以不是逗號,是一種通用的、相對簡單的檔案格式,被使用者、商業和科學廣泛應用。其檔案以純文字形式儲存表格資料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資料。CSV檔案由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由欄位組成,欄位間的分隔符是其它字元或字串,最常見的是逗號或製表符。通常,所有記錄都有完全相同的欄位序列。
下面我們就利用strtok()來讀取一下CSV檔案中的內容,作為例子考慮下面這個簡單的CSV檔案:
編碼時可能需要注意的地方主要有兩點:1)傳統上,C語言中沒有像getline()那樣一行一行讀檔案的函式,所以我們需要使用fgets()來替代(但最新版本的C語言中已經引入了一個getline()函式,我們會在後面的文章中再介紹它);2)CSV檔案的每行會用一個'\n'來結束,讀取一行內容時,應該設法把這個回車符去掉。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LINE_SIZE 20
int main(int argc, const char * argv[]) {
char file_name[] = "test_data.csv";
FILE *fp;
fp = fopen(file_name, "r");
if (!fp) {
fprintf(stderr, "failed to open file for reading\n");
return 1;
}
char line[MAX_LINE_SIZE];
char *result = NULL;
while(fgets(line, MAX_LINE_SIZE, fp) != NULL) {
result = strtok(line, ",");
int i = 0;
while( result != NULL ) {
if(i!=0){
printf("%d\t", atoi(result));
}
else{
printf("%s\t", result);
i++;
}
result = strtok(NULL, ",");
}
printf("\n");
}
fclose (fp);
return 0;
}
執行上述程式碼,輸出結果如下:
James 85 67 34
Thomas 27 82 100
Jason 1 23 98
Charls 35 62 78
(本文完)