自定函数实现C++读取CSV文件

C++是一个应用方式非常灵活的编程语言。我们可以通过自己的需求,自己编写一个适合自己开发的函数来实现一些特定的功能。比如今天为大家介绍的就是自定义函数来实现C++读取CSV文件这一功能。

今天恰好做一个东西需要一个C++读取CSV文件的函数。

没有找到现成的函数,所以就自己写了一个。

目的就是实现C++读取CSV文件,每一行读到一个数组中。

有点生疏了,字符串处理函数都不知道有什么现成的,所以也写了两个辅助的字符串处理函数。

第一个函数:计算一个字符串中的某个子串的个数

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

相关推荐