1. 程式人生 > >C語言讀取CSV檔案的方法1

C語言讀取CSV檔案的方法1

1、字串處理中的 strtok() 函式

我們首先來介紹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	


(本文完)