CSVファイルの読み取り関係関数(TKInfo.dll)(Ver7.22対応版)
 CSV形式ファイルから各カラムの文字列を取り出す関数を用意しました。(Version 6.19β15にて)
 これらの関数はすべて「CSV_」で始まる名前になっています。

 秀丸メールのVersion 6.94β26から、これらの関数は秀丸エディタ上でも使えるようにしました。
CSV_LoadFile関数
 CSV_LoadFile関数は、パラメータで指定されたファイルをロードして、以後のCSV_xxx系関数を使えるようにします。
 パラメータには、CSVファイルのファイル名(文字列)を指定します。
 返り値は数値型で、成功したら1、失敗したら0を返します。
 失敗した場合はBypass_GetLastError関数でエラーコードが取得できます。例えばファイルが見つからない場合はERROR_FILE_NOT_FOUND(数値の2)が取得できます。
 ファイルの読み込みに成功した場合でも、ファイルの中身が空っぽだった場合は失敗したのと同じ扱い(返り値=0)になります。

 ファイルのエンコード種類は、Shift-JISか、またはBOM付きのUTF-8/UTF-16なら正しく解釈します。BOM無しのUTF-8ファイルはShift-JISの扱いになってしまいます。
 ファイルサイズが極端に大きい場合もエラーになる可能性があります。

 秀丸エディタ上で実行した場合の制限:UTF-8またはUTF-16形式ファイルの場合でShift-JIS範囲外の文字がある場合、それはうまく読み込めず、「?」などの文字に変換されてしまいます。


CSV_Free関数
 CSV_Load関数でロードした情報を解放します。この関数を呼ぶと、ロードによって確保した動的メモリを解放するだけで、呼び出さなくてもゴミデータがメモリ上に残るだけで、大きな問題はありません。
 この関数にはパラメータはありません。返り値は数値型ですが、値に意味はありません。


CSV_GetLineCount関数
 CSV_GetLineCount関数は、現在読み込まれたCSVファイルの行数を返します。返り値は数値型です。
 この関数は、CSVファイルの行数を単純に返すのではなく、CSV形式として正しく解釈した後の行数を返します。具体的には、""で囲まれた中に含まれる改行はカウントしないで行数を計算します。
 パラメータはありません。


CSV_GetMaxColumnCount関数
 CSV_GetMaxColumnCount関数は、現在読み込まれたCSVファイルのカラム数(桁数)の最大を計算して返します。返り値は数値型です。
 読み込んだファイルの中をすべてスキャンして結果を返します。
 パラメータはありません。


CSV_SetCurrentLine関数
 CSV_SetCurrentLine関数は、後で説明するCSV_GetColumnCount, CSV_GetColumnText関数で取得する行の位置を指定します。パラメータに行番号(先頭行が0、次の行が1…)を指定します。返り値は数値型で、成功した場合(実際にその行が存在する場合)は1を返し、存在しない場合は0を返します。
 CSV_LoadFile関数呼び出しをした直後は「現在の行」は0、つまり、ファイルの先頭行になっています。


CSV_SkipOneLine関数
 CSV_SkipOneLine関数は、後で説明するCSV_GetColumnCount, CSV_GetColumnText関数で取得する行の位置を1行下に移動します。パラメータはありません。返り値は数値型で、成功した場合(次の行が存在する場合)は1を返します。パラメータで指定された行が存在しない場合は0を返します。


CSV_GetColumnCount関数
 CSV_GetColumnCount関数は、現在行のカラム数を返します。返り値は数値型で、パラメータはありません。


CSV_GetColumnText関数
 CSV_GetColumnText関数は、現在行のカラムの文字列を返します。パラメータにカラムの番号(先頭= 0)を指定します。返り値は文字列型です。
 カラムの文字列がダブルクォーテーションで囲まれている場合はダブルクォーテーションを取って返します。また、ダブルクォーテーションの記号そのものも、CSVファイル上で「""」になってる物は、1つだけの「"」に変換して返します。


サンプル
    $file = "e:\\temp\\temp.csv";
    loaddll "tkinfo.dll";
    if( ! dllfunc("IsFunctionExist", "tkinfo.dll", "CSV_LoadFile") ) {
		message "秀丸メールのバージョンが古いのでCSV関数は使えません。";
		endmacro;
	}
    #n = dllfunc("CSV_LoadFile", $file );
    if( #n == 0 ) {
        message "エラー、コード = " + str(dllfunc("Bypass_GetLastError"));
        endmacro;
    }
    #n = dllfunc("CSV_GetLineCount");
    message "linecount = " + str(#n);
    #n = dllfunc("CSV_GetMaxColumnCount");
    message "max column count = " + str(#n);
    while(1) {
        #c = dllfunc("CSV_GetColumnCount");
        #i = 0;
        $s = "column count = " + str(#c) + "\n\n";
        while( #i < #c ) {
            $s = $s + "column " + str(#i) + " = " + dllfuncstr("CSV_GetColumnText", #i) + "\n\n";
            #i = #i + 1;
        }
        message $s;
        #n = dllfunc("CSV_SkipOneLine");
        if( #n == 0 ) {
            break;
        }
    }
    message "終了";