C++寫的一個讀取CSV檔案的函數

來源:互聯網
上載者:User

第一個函數:計算一個字串中的某個子串的個數
int strstr_cnt(const char *string, const char *substring) {
 int i,j,k,count = 0;
 for (i = 0; string[i]; i++){
  for (j = i, k = 0; (string[j] == substring[k] && (j < strlen(string))); j++,k++) {
   if (! substring[k + 1]) {
    count++;
   }
  }
 }
 return count;
}

第二個函數:計算一個子串在字串中的位置
int substring_index(const char *s1,const char *s2, int pos){
    int i,j,k;
    for( i = pos ; s1[i] ; i++ ) {
        for( j = i, k = 0 ; s1[j] == s2[k]; j++,k++ ){
            if (! s2[k + 1]) {
                return i;
            }
        }
    }
    return -1;
}

第三個函數:讀取已經開啟的一個CSV檔案的一行,將這一行處理到一個數組中。
char *fgetcsvline(vector<string> &csv_databuf, FILE *fhead) {
    char  *ret_stat;
    char  data_buf[1024];
    string stringbuf;
    ret_stat = fgets( data_buf, 1024, fhead );
    
    if (ret_stat != NULL) {
        int len = strstr_cnt(data_buf,"\",\"");
        if (len > 0){
            int pos = substring_index(data_buf,"\",\"",0);
            int startpos = 1;
            string csv_buf;
            while (pos > 0) {
                stringbuf = (string)data_buf;
                csv_buf = stringbuf.substr(startpos,pos - startpos);
                csv_databuf.push_back(csv_buf);
                startpos = pos + 3;
                pos = substring_index(data_buf,"\",\"",pos + 2);
            }
                if ((substring_index(data_buf,"\n",0)) > 0){
                       csv_buf = stringbuf.substr(startpos, stringbuf.length() - startpos - 2);
                } else {
                       csv_buf = stringbuf.substr(startpos, stringbuf.length() - startpos - 1);
                }
            csv_databuf.push_back(csv_buf);
        }
    }

    return ret_stat;    
}

這個函數使用上面的兩個函數來處理字串。
另外這個函數用來處理的CSV檔案是帶雙引號格式的:
"sss","ddd","444"
"ttt","www","ooo"
"sss","qqq","000"
使用方法如下:
int main(int argc, char* argv[]) {
    FILE  *fp_head;
    string csvFileName = "test.csv";
    char  *ret_stat;
    vector<string> csv_data;

    fp_head = fopen( csvFileName, "rt" );
    ret_stat = fgetcsvline(csv_data,
fp_head);
    while (ret_stat != NULL) {
        //get csv data use csv_data[n]
        ret_stat
= fgetcsvline(csv_data, fp_head);
    }

    return 0;
}


以上代碼可能需要稍加調試。
也可稍加改動用來讀取其它格式的csv檔案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.