参考
前回記事
JV-LinkをC#で使ってみる(Console版) ~4.JV-Dataのダウンロード/読み込み進捗状況を表示する~
WinForms版
JV-LinkをC#で使ってみる(WinForms版) ~5.コード変換を行う~
今回のソースコード
source – JV-LinkをC#で使ってみる(Console版) ~5.コード変換を行う~
開発環境
- Windows7 64ビット版
- Visual Studio Community 2017
- JV-Link Ver.4.5.1
はじめに
前回、「コード変換クラス」をVBからC#に移植しました。正直言って、よく分からない変数が大量に並んでいてほとんど理解せずに移植しました。あのサンプルを見てすぐに内容が把握できる人を素直に「凄い!」と思います。ですので、そんな自分でもわかるように一から作り直してみました。
コーディング
コード変換クラスの作成
コンストラクタ
public CodeConv()
{
fileName = "";
fileOpen = -1;
code = new Dictionary<Tuple<string, string>, string[]>();
}
変数の初期化を行います。Key1とKey2は文字列として、Valueは文字列配列として作成しています。
「FileOpen()」関数
public int FileOpen(string filename)
{
code.Clear();
try
{
using (StreamReader sr = new StreamReader(filename, System.Text.Encoding.GetEncoding("shift_jis")))
{
string[] strlist;
while ((strlist = sr.ReadLine().Split(',')) != null)
{
code[Tuple.Create(strlist[0], strlist[1])] = strlist;
}
}
fileName = filename;
fileOpen = 0;
return fileOpen;
}
catch (Exception)
{
fileName = "";
fileOpen = -1;
return fileOpen;
}
}
VBサンプルではプロパティに名前を設定することでファイルを読み込んでいましたが、個人的にはファイルをオープンしていると分かる関数のほうが良いと思います。
- StreamReaderを使ってファイルを開きます。
- ReadLine()関数でテキストファイル(CSV)を1行読み込みます。この関数は1行分の文字列をstringで返します。
- Split()関数で文字列をカンマ区切りの文字列リストにしています。
- 文字列リストの先頭2要素をKey1とKey2のペアとして新たなKeyとし、文字列リストをDictionaryに保存します。
例外処理を除くと、大まかにはこのような処理となっていますが、この部分だけでVBサンプルのSetLine()関数とSetData()関数とFileNameプロパティの3つを網羅しています。前回作成したVBサンプル移植版と比較するとだいぶ短く見やすいかと思います。
インデクサ(対象データのみ返す)
public string this[string key1, string key2, int n]
{
get
{
try
{
return code[Tuple.Create(key1, key2)][n + 1];
}
catch (Exception)
{
return null;
}
}
}
インデクサは作成したオブジェクトを配列やリストのように扱う機能です。オブジェクトにkey1,key2,nを指定すると、対象のデータを返します。VBサンプルではGetCodeName()関数の部分に対応します。
インデクサ(対象データの配列を返す)
public string[] this[string key1, string key2]
{
get
{
try
{
return code[Tuple.Create(key1, key2)];
}
catch (Exception)
{
return null;
}
}
}
VBサンプルにはありませんが、key1,key2を指定すると対象のデータの配列を返す関数です。処理自体は、Dictionaryにキーを渡して値を返しているだけです。
メインプログラムの修正
前回からの修正点はとても少ないです。
var cv = new CodeConv();
cv.FileOpen("CodeTable.csv");
コード変換クラスのオブジェクトのインスタンスを作成し、ファイルを読み込みます。
// レース詳細を画面表示
Console.WriteLine(
"年:" + raceInfo.id.Year +
" 月日:" + raceInfo.id.MonthDay +
// " 場:" + raceInfo.id.JyoCD +
" 場:" + cv["2001", raceInfo.id.JyoCD, 3] +
" 回次:" + raceInfo.id.Kaiji +
" 日次:" + raceInfo.id.Nichiji +
" R:" + raceInfo.id.RaceNum +
" レース名:" + raceInfo.RaceInfo.Ryakusyo10 +
"\n"
);
コード変換クラスのオブジェクトからデータを読み込みます。 (変更は115,116行目のみ)
動作確認
コードの編集が完了したらプログラムを実行して動作を確認します。
以上で、コード変換クラスの作成が完了となります。