カテゴリー
Software Tech

[C#備忘録]XMLファイルで集計 | AmpiTa Project

 AmpiTa(多用途安否確認システム)に新しいフォームを増設することになり、手順を忘れていることが多いので、次回のために備忘録を作成しています。




大量のデータも軽量で扱えるXML

 今から20年以上前、Visual Basic 6.0の頃はデータを扱うためにAccessのファイルと連携したり、わざわざデータベースを構築して大量のデータを処理していました。

 XMLでデータベースを構築すると、その構築作業は非常に簡単であり、なおかつEXEファイル動作時の処理も軽いとあって、非常に便利に利用させて頂いています。




XML初期設定

 XMLをデータベースとして出力する場合、必要になるのがデータが格納される『.xml』ファイルと、データベースを規定するためのスキーマファイル『.xsd』の2つです。

 XMLファイルとして出力するか否かに関わらず、データベースの構築は必要になるので、まずは下記のようなコードを入力します。

DataSet dsSimulationEnergy = new DataSet();
DataTable dt_SimEng = new DataTable();
dt_SimEng.TableName = "dt_SimEng";
dt_SimEng.Columns.Add("項目1");
dt_SimEng.Columns.Add("項目2");
dt_SimEng.Columns.Add("項目3");
dt_SimEng.Columns[0].DataType = typeof(int);
dt_SimEng.Columns[0].DataType = typeof(Double);
dt_SimEng.Columns[0].DataType = typeof(DateTime);

 まずはデータセット(DataSet)として『dsSimulationEnergy』という名称で宣言しました。名称は何でも良いのですがデータセットであることがわかるように『ds』で始めています。

 次にデータが納められるデータテーブル(DataTable)を『dt_SimEng』という名称で宣言しました。これは『dt』から始めています。

 次の『dt_SimEng.TableName = “dt_SimEng”』では、データテーブルのテーブルネーム(テーブル名)を決定しています。あとでXMLファイルを開いてみるとわかりますが、本文の中にこのテーブル名が記されているので、これが一致しないと機能しない可能性があります。

 既に存在するXMLファイルやXSDファイルを使う場合は、下記のような記述をします。ReadXmlやReadXmlSchemaで既存ファイルを読み込んでいます。

DataSet dsTmp = new DataSet();
DataTable dt_Tmp = new DataTable(); 
dt_Tmp .TableName = "dt_SimEng";
dt_Tmp .ReadXmlSchema(str_XSD_Path);
dt_Tmp .ReadXml(str_XML_Path);
dsTmp .Tables.Add(dt_Tmp );




XMLデータ格納

 次に、データを格納していく処理を示します。

 今回の処理は時刻1分から、テキストボックスに入力した時刻(分)まで処理するというプログラムです。1日分なら1,440分、2日分なら2,880分といった具合です。

 ここでは『for』で循環、テキストボックスの『txb_GbxTab02_10_12』に示されているテキストデータを『Int32.Parse』で『int』形式に変換して、その数(時刻)に至る前まで循環するよう指示しています。

 データの格納先は『DataRow』で指示します。『dtRow』という所にデータテーブルの新しい行の情報を入れてください、という指示が冒頭に来ます。まだデータは反映されていません。仮の伝票のようなものです。

 次に第一項目の『dtRow[0]』には、今何分の処理であるのかわかるように『int』形式の数字を入れます。

 第二項目は『Double』形式の数値です。既に変数に入れられています。

 第三項目は現在の日時です。初期設定で日時形式としてあるので簡単に格納できますが、もし指定が無ければ文字列として入力する必要がありますので『DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss”)』のような形になります。

 最後に『Add』の指示を出すと、ここで作られた仮伝票が帳簿に記帳されて残されることになります。

for (intRound = 1; intRound < Int32.Parse(txb_GbxTab02_10_12.Text); intRound++)
{
    DataRow dtRow = dt_SimEng.NewRow();
    dtRow[0] = intRound;
    dtRow[1] = dbl_Flag_PowerSupply;
    dtRow[2] = DateTime.Now;
    dt_SimEng.Rows.Add(dtRow);
}
          

 これらのデータをファイルに出力して保存する場合には、下記のようなWriteコードを記述します。『str_XML_Path』などはファイル名です。予め指定し変数に格納しておくことでミスを防ごうとしています。

dt_SimEng.WriteXmlSchema(str_Schema_Path);
dt_SimEng.WriteXml(str_XML_Path);




XSD(Schema)データ

 XSDファイルを開いてみると、下記のようになっています。ここでデータテーブル名が『dt_SimEng』になっていることが確認できます。

 各項目の名称や形式はここで取得されます。項目番号ゼロ番目にあるものは名称を『項目1』、その形式は『int』とする指示が行われています。

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="dt_SimEng" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="dt_SimBlkSet">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="項目1" type="xs:int" minOccurs="0" />
              <xs:element name="項目2" type="xs:double" minOccurs="0" />
              <xs:element name="項目3" type="xs:dateTime" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>




XMLデータ

 XMLファイルを開いてみると、下記のようになっています。ここでも『dt_SimEng』が記述されています。

 以下、項目名、値、項目を閉じるという記述が並びます。

<DocumentElement>
<dt_SimEng>
<項目1>1</項目1>
<項目2>6.0</項目2>
<項目3>2024-02-22T14:36:00.2360227+09:00</項目3>
</dt_SimEng>



おわりに

 XMLは非常に単純な、テキストデータを読込んでデータベースとして扱って貰えるような仕組みなので、C#でプログラムを組む時には多用しています。

 特別な技を持っていないので、シンプルに使っています。




関連記事

「[C#備忘録]XMLファイルで集計 | AmpiTa Project」への1件の返信