相关文章推荐
可爱的烤红薯  ·  Invalid use of group ...·  1 年前    · 
高大的毛衣  ·  android - ...·  1 年前    · 
注册/登录

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

开发 后端
C++读取CSV文件需要一个合适的函数来进行具体的操作。如果没有现成的函数供我们使用,我们可以自己编写一个来方便我们的使用。

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

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

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

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

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

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

  1. int strstr_cnt(const char *string, const char 
    *substring) {  
  2. int i,j,k,count = 0;  
  3. for (i = 0; string[i]; i++){  
  4. for (j = ik = 0; (string[j] == 
    substring[k] && (j 
    < strlen(string))); j++,k++) {  
  5. if (! substring[k + 1]) {  
  6. count++;  
  7. }  
  8. }  
  9. }  
  10. return count;  

第二个函数:计算一个子串在字符串中的位置

  1. int substring_index(const char *s1,const char *s2, int pos){  
  2. int i,j,k;  
  3. for( i = pos ; s1[i] ; i++ ) {  
  4. for( j = ik = 0 ; s1[j] == s2[k]; j++,k++ ){  
  5. if (! s2[k + 1]) {  
  6. return i;  
  7. }  
  8. }  
  9. }  
  10. return -1;  

第三个函数:读取已经打开的一个CSV文件的一行,将这一行处理到一个数组中。

  1. char *fgetcsvline(vector<string> &csv_databuf, FILE *fhead) {  
  2. char *ret_stat;  
  3. char data_buf[1024];  
  4. string stringbuf;  
  5. ret_stat = fgets( data_buf, 1024, fhead );  
  6. if (ret_stat != NULL) {  
  7. int len = strstr_cnt(data_buf,"\",\"");  
  8. if (len > 0){  
  9. int pos = substring_index(data_buf,"\",\"",0);  
  10. int startpos = 1;  
  11. string csv_buf;  
  12. while (pos > 0) {  
  13. stringbuf = (string)data_buf;  
  14. csv_buf = stringbuf.substr(startpos,pos - startpos);  
  15. csv_databuf.push_back(csv_buf);  
  16. startpos = pos + 3;  
  17. pos = substring_index(data_buf,"\",\"",pos + 2);  
  18. }  
  19. if ((substring_index(data_buf,"\n",0)) > 0){  
  20. csv_buf = stringbuf.substr(startpos, stringbuf.length() 
    - startpos - 2);  
  21. } else {  
  22. csv_buf = stringbuf.substr(startpos, stringbuf.length() 
    - startpos - 1);  
  23. }  
  24. csv_databuf.push_back(csv_buf);  
  25. }  
  26. }  
  27. return ret_stat;   

这个函数使用上面的两个函数来处理字符串。

另外这个函数用来处理的CSV文件是带双引号格式的:

  1. "sss","ddd","444"  
  2. "ttt","www","ooo"  
  3. "sss","qqq","000" 

使用方法如下:

  1. int main(int argc, char* argv[]) {  
  2. FILE *fp_head;  
  3. string csvFileName = "test.csv";  
  4. char *ret_stat;  
  5. vector<string> csv_data;  
  6. fp_head = fopen( csvFileName, "rt" );  
  7. ret_stat = fgetcsvline(csv_data, fp_head);  
  8. while (ret_stat != NULL) {  
  9. //get csv data use csv_data[n]  
  10. ret_stat = fgetcsvline(csv_data, fp_head);  
  11. }  
  12. return 0;  

以上代码可能需要稍加调试。也可稍加改动用来读取其它格式的csv文件。

以上就是C++读取CSV文件的相关实现方法。

责任编辑:曹凯 博客园
点赞
收藏