BCC32Cを使ってみた

自作ソフトの紹介

1)CSVデータの読込み関数
 1-1)フリーウエア、CSVasAPI32b.dll


概要

このDLLは、CSV(カンマ区切り)ファイル、TSV(タブ区切り)ファイルを使うための関数を提供します。

2000年にMicrosoft Visual C++で開発し、ベクターで公開しましたが、更新が出来ず、そのままになっていました。2015年にその後継であるEmbarcadero C++ Compiler(BCC32C.EXE)が公開されたのを機に、新しい開発環境で更新版を開発し、2019年に公開しました。ベクターのURLは、こちらです。
    https://www.vector.co.jp/soft/winnt/prog/se153059.html

また、32bitアプリケーションであることが明確に分かるようにファイル名を「CSVasAPI32b.dll」と変更しました。

ここでは、ベクターに公開したものの、ソースファイルを掲載します。提供するAPIについての説明も行います。

ファイル

   CSVasAPI32b.c・・・・・・・ソースファイル
   CSVasAPI32b.h・・・・・・・ヘッダファイル
必要な方は、こちらから。

このソフトウエアの著作権は作者(Kimio Nakamura)にありますが、ご自由に利用いただけます。当ソフトウエア利用による直接・間接の損害を補償しません。
当初のVisual C++で開発した時の名残が残っていますので、分かりにくいかもしれませんが、ご了承ください。

コンパイル、ライブラリ作成の結果は、こちらです。  



主な処理

@文字列獲得関数
  CSV_sget、TAB_sget
    ・セパレータ(「,」、TAB)を指定して、文字列の取出し関数(all_sget)を呼び出す。
  all_sget
    ・指定されたフィールドが存在(no番が有効、0バイトでない)するかチェックする。
    ・no番目のフィールドの文字列を取り出す。
A整数(int)獲得関数・・・・整数(long)、浮動小数点(float、double)も同様処理
  CSV_iget、TAB_iget
   ・セパレータ(「,」、TAB)を指定して、整数(単精度)取出し関数(all_iget)を呼び出す。
  all_iget
   ・文字列の取出し関数(all_sget)を呼び出し、no番目のフィールドの文字列を取り出す。
   ・数値かどうか(数字、符号、「.」、「,」、E・e以外はNG)をチェックする。
   ・文字列を整数(int)に変換する。


API仕様

文字列、数値(int、long、float、double)を1行の文字列から、フィールド番号を指定して取得する関数@〜Dとその他(Fフィールド数計算、Gフィールド長、Hバージョン数)の関数に分かれます。
  ※制限事項
   ・日本語は、Shift−JISのみが対象です。unicodeは未対応です。
   ・文字列に「"」が含まれる場合(エスケープシーケンス「\"」)は扱えません。

【関数名】 int CSV_sget(char *str ,char *dstr , int no)
       int TAB_sget(char *str ,char *dstr , int no)
   ・機能 レコード中のno番目の項目を文字列として取り出す。 
   ・引数  *str  :元の文字列
         *dstr :取出した文字列を格納するバッファ(必要なサイズをもつこと)
         no  :取出すフィールド番号
   ・戻り値  CSVTAB_OK               0(OK)
   ・備考   文字列が””(ダブルクォテーション)で囲まれていれば、
          はずして返します。取出した文字列を格納する文字列を
          与えますが、事前に適当なサイズを確保する必要があります。
          例  char dstr[100]
【関数名】 int CSV_iget(char *str ,int *dint, int no)
       int TAB_iget(char *str ,int *dint, int no)
   ・機能 レコード中のno番目の項目を整数(int型)として取り出す。
   ・引数  *str  :元の文字列
         *dint  :取り出した結果を返す整数(単精度)
         no  :取出すフィールド番号
   ・戻り値  CSVTAB_OK       0
   ・備考   フィールドが数字で使う文字(数字、符号、少数点、
          カンマ、e・E)であることで数値と判断する。
【関数名】  int CSV_lget(char *str ,long *dlong, int no)
        int TAB_lget(char *str ,long *dlong, int no)
   ・機能 レコード中のno番目の項目を整数(long)として取り出す。
   ・引数  *str  :元の文字列
         *dlong  :取り出した結果を返す整数(倍精度)
         no    :取出すフィールド番号
   ・戻り値 CSVTAB_OK           0
   ・備考 フィールドが数字で使う文字(数字、符号、少数点、カンマ、e・E)で
        あることで数値と判断する。
【関数名】 int CSV_fget(char *str ,long *dfloat, int no)
       int TAB_fget(char *str ,long *dfloat, int no)
   ・機能   レコード中のno番目の項目を浮動小数点(単精度)として取り出す。
   ・引数   *str:元の文字列
          *dfloat:取り出した結果を返す小数(単精度)
          no:取出すフィールド番号 
   ・戻り値   CSVTAB_OK       0
   ・備考  フィールドが数字で使う文字(数字、符号、少数点、カンマ、e・E)で
         あることで数値と判断する。

【関数名】  int CSV_dget(char *str ,double *ddouble, int no)
        int TAB_dget(char *str ,double *ddouble, int no) 
    ・機能  レコード中のno番目の項目を浮動小数点(倍精度)として取り出す・
    ・引数  *str  :元の文字列
          *ddouble:取り出した結果を返す小数(倍精度)
          no    :取出すフィールド番号
    ・戻り値   CSVTAB_OK       0
    ・備考  フィールドが数字で使う文字(数字、符号、少数点、カンマ、e・E)で
          あることで数値と判断する。

【関数名】  int CSV_count(char *str )
        int TAB_count(char *str )
   ・機能 フィールド数計算をする。レコード中の区切り文字の数を数えて
        フィールド数を返す。
   ・引数 *str:元の文字列
   ・戻り値 フィールド数
         ERR_CSVTAB_NO_STRING -2(文字列なし)
   ・備考 「CSV_count」は「,」で区切られたフィールド数を返します。
        文字列が、「“ ”」(ダブルクォテーション)で挟まれていたら、
        その中の「,」は文字列の一部としてカウント対象外とします。
【関数名】  int CSV_len(char *str ,int no)
        int TAB_len(char *str ,int no)
    ・機能  レコード中のno番目の項目の長さを計算して返します。
    ・引数  *str  :元の文字列
          no   :取出すフィールド番号
    ・戻り値 フィールドの長さ
          ERR_CSVTAB_SYNTAX       -1(エラー)
          ERR_CSVTAB_NO_STRING     -2(文字列なし)
          ERR_CSVTAB_NOT_FIELD     -3(フィールドなし)
    ・備考 
【関数名】int CSV_version(void)
    ・機能  CSVasAPI32b.dllのバージョン(×100)を返します。 
    ・引数  なし
    ・戻り値 バージョン×100
    ・備考  CSV_version()のみです。TSB_version()はありません。


使用例

プロ野球、パリーグの成績表ファイル(テキスト、TAB区切り)を読み込み、表示するサンプルプログラムです。ファイルを読み込み、画面に表示します。

CSVasAPI.dllの関数を利用するために、ソースファイルにヘッダファイル(CSVasAPI32b.h)をインクルードします、メイクファイルの中でリンク用のライブラリ(CSVasAPI32b.LIB)を追加します。

@がソースプログラムで、コンパイル結果がA、実行結果がBです。ここで使用したファイルはこちら

@ソースプログラム

// BCCsample.c CSVasAPI32b.DLL 用 サンプル(C言語), 2019.02.28
//    Copyright (C) 2019 K.Nakamura

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "csvasapi32b.h"

int main( void)
{
  char record[500];
  char temp_s[50];
  int i;
  int temp_i;
  float temp_f;

  FILE *fp;

  fp =fopen("sample_t.txt","rt");
  fgets(record,500,fp);

  printf("\n");

  for(i=0 ; i<9 ;i++){
    TAB_sget(record,temp_s,i+1);
    printf("%6s ",temp_s);
  }
  printf("\n");
  
  while(1){

    if(fgets(record,500,fp)==NULL) break;

    TAB_iget(record,&temp_i,1);
    fprintf(stdout, "%6d ",temp_i);
    TAB_iget(record,&temp_i,2);
    fprintf(stdout, "%6d ",temp_i);

    TAB_sget(record,temp_s,3);
    fprintf(stdout, "%.10s",temp_s);

    TAB_iget(record,&temp_i,4);
    fprintf(stdout, "%6d",temp_i);
    TAB_iget(record,&temp_i,5);
    fprintf(stdout, "%6d ",temp_i);
    TAB_iget(record,&temp_i,6);
    fprintf(stdout,"%6d ",temp_i);
    TAB_iget(record,&temp_i,7);
    fprintf(stdout,"%6d ",temp_i);

    TAB_fget(record,&temp_f,8);
    fprintf(stdout, "%6.3f ",temp_f);
    TAB_fget(record,&temp_f,9);
    fprintf(stdout, "%6.2f ",temp_f);

    fprintf(stdout, "\n");
  
  }
  fclose(fp);
  return 0;
}
  

 


Aコンパイル結果



C実行結果


戻る   次へ