自作ソフトの紹介
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)に変換する。
文字列、数値(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実行結果


|