アットウィキロゴ

C言語 CSVを開いて文字列取得

CSV_Iクラス:
CSVファイルを読み込むクラス。
store_strで一行ずつデータを読み込む。
変数の型変換などは、呼び出し元のプログラムに任せる。
素朴な処理(一文字ずつ処理してる)なので、処理が重いかも。
文字列ストリーム処理をすべき?

  1. /*************************
  2.  CSV_I.h
  3. *************************/
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7.  
  8. #ifndef _CSV_I_H_
  9. #define _CSV_I_H_
  10.  
  11. class CSV_I{
  12.  
  13. typedef char buftype[64] ;
  14.  
  15. FILE* ifp; //出力するCSVのファイルポインタ
  16. int row, col;
  17. static const int FGETS_SIZE = 512;
  18.  
  19. public:
  20. CSV_I(){ifp = NULL;}
  21. bool open_csv(const char* filename); //引数で与えたファイル名のCSVをオープンする
  22. bool store_str(char L, char R, buftype buf_ary[]); //L列からR列までの要素をbuf_ary[]に格納する
  23. ~CSV_I();
  24.  
  25. private:
  26. };
  27.  
  28. #endif //_CSV_I_H_
  29.  



  1. /*************************
  2.  CSV_I.cpp
  3. *************************/
  4. #include "CSV_I.h"
  5.  
  6. //引数で与えたファイル名のCSVをオープンする
  7. bool CSV_I::open_csv(const char* filename){
  8. if(ifp){
  9. fclose(ifp);
  10. }
  11. if(!(ifp = fopen(filename, "r+"))){
  12. return false;
  13. }
  14.  
  15. return true;
  16. }
  17.  
  18. //L列からR列までの要素をbuf_ary[]に格納する
  19. bool CSV_I::store_str(char L, char R, buftype buf_ary[]){
  20. char line_buf[FGETS_SIZE];
  21. int s = L - 'A'; //引数の列名を整数型に変換
  22. int t = R - 'A';
  23.  
  24. if(L > R){ //引数エラー
  25. return false;
  26. }
  27. if(!fgets(line_buf, FGETS_SIZE, ifp)){
  28. return false;
  29. }
  30. memset(buf_ary, '\0', sizeof(buftype)*(R-L+1));
  31. //fprintf(stderr, "%s", line_buf);
  32. for(int i=0, j=0; i<t; i++){ //i:コンマごとのカウンタ。j:文字ごとのカウンタ
  33. for(int k=0; line_buf[j] != ','; k++){
  34. if(i<s){ //L列より左の要素は切り捨てる
  35. j++;
  36. }
  37. else{
  38. buf_ary[i-s][k] = line_buf[j];
  39. //fprintf(stderr, "%c", line_buf[j]);
  40. j++;
  41. }
  42. }
  43. j++; //コンマ分インクリメント
  44. }
  45. }
  46.  
  47.  
  48.  
  49.  
  50. CSV_I::~CSV_I(){
  51. if(ifp){
  52. fclose(ifp);
  53. }
  54. }
  55.  


/***** 利用例 *****
  1. #include "csv_i.h"
  2.  
  3. #define CSV_FILE "C:\\tex\\temp.csv"
  4.  
  5. #define LCOL 'A'
  6. #define RCOL 'G'
  7.  
  8. int main (){
  9.  
  10. CSV_I ci;
  11.  
  12. typedef char buftype[64];
  13.  
  14. buftype buf_ary[RCOL-LCOL+1];
  15.  
  16. ci.open_csv(CSV_FILE);
  17. for(int i=0; ci.store_str(LCOL, RCOL, buf_ary); i++){
  18. for(int j=0; j<RCOL-LCOL+1; j++){
  19. fprintf(stderr, "%s, ", buf_ary[j]);
  20. }
  21. putchar('\n');
  22. }
  23.  
  24. return 0;
  25. }
  26.  
*************/

累計のアクセス数: -
今日のアクセス数: -
昨日のアクセス数 -

タグ:

C言語 CSV
最終更新:2011年07月25日 08:18