HDF5DotNet : 値の読み込み2013年02月09日 21:05

数値型の読み込み方法について

読み込みでは、"H5D"クラスにある、"read<>"のジェネリックメソッドを使用する。
同じクラスにある"write<>"と同じ引数"H5DataSetId"と"H5TypeId"が必要なので、取得する必要がある。もう一つの引数は"H5Array<>"を指定する。

まずは"H5D"クラスにある"open"メソッドを使用する。引数はfileOrGroupId("H5FileOrGroupId"クラス)とdataSetName("string"クラス)。戻り値は"H5DataSetId"。要はこのメソッドで"H5DataSetId"を取り出す。ただし、グループ内に指定の引数指定のdataSetNameがない場合は"Exception"をthrowするので注意。
H5DataSetId dataSetID = H5D.open( fileID,"TestDataSet" );
"H5TypeId”クラスの取得については、上記で取得した"H5DataSetId"を使用して取得できる。"H5D"クラス内の、"getType"メソッドを使用。引数は上記で取得した"H5DataSetId"クラスを指定する。
H5DataTypeId dataTypeID = H5D.getType( dataSetID );
あとは"H5Array<>"を準備する。ジェネリックなので型を指定する。インスタンス作成時の引数はジェネリックで指定した型の配列を入れる。この中にデータの中身が入れられる。
int[] intArray = new int[]{0};
H5Array<int> array =
new
 H5Array<int>( myArray );
仕上げに、"H5D"クラスの"read<>"ジェネリックメソッドを実行してデータを取り出す。
H5D.read<int>( dataSetID , dataTypeID , array  );
int returnValue = intArray[0];
使用後は、"close"メソッドが使用できるものは閉じて終了。
以下、サンプル
H5FileId fileID = H5F.open( "C:\\HDFSampleFile.hdf5"H5F.OpenMode.ACC_RDWR );
H5DataSetId dataSetID = H5D.open( fileID,"TestDataSet" );
H5DataTypeId dataTypeId = H5D.getType( dataSetID );
int[] intArray = new int[] { 0 };
H5Array<int> array = new H5Array<int>( intArray );
H5D.read<int>( dataSetID, dataTypeId, array );
int returnValue = intArray[ 0 ];
H5D.close( dataSetID );
H5T.close( dataTypeId );
H5F.close( fileID );

HDF5DotNet : グループの作成など2013年02月08日 22:03

グループの作成方法について

HDFViewでは、データツリー表示部分にて、値が追加できる。
簡単に書くと、

データツリー部上でコンテキストメニュー表示(ファイルを読み込んでいない場合は先に読み込むorHDFViewのファイルメニューから作成する。)→New→DataSet→ダイアログを埋めていけばOK。

このコンテキストメニュー上のNewの中には"Group"という項目もある。今回はこのグループを作成する。
(HDFViewについてはまた別にメモするかも)

さて、グループを作成するには"H5G"クラスにある"create"メソッドを使用する。引数と戻り値は以下の通り、
 

 引数
  "fileOrGroupId" : "H5LocId"インターフェース、名前の通り"H5FileId"クラス、もしくは"H5GroupId"クラスを指定する。
  "groupName" : "string"クラス、グループ名に使用される。
 
 
 
 戻り値
  "H5GroupId"クラス、最後はもちろん"H5G"の"close"メソッドで閉じる必要がある。

上記の"fileOrGroupId"は、その名前の通り、"H5FileId"以外に"H5GroupId"も使用可能。なので何層もの階層を作成することができる。WiodowsのExplorerのような物として考えるとわかりやすい。以下グループ作成のサンプル。
H5GroupId groupID = H5G.create( fileID,"TestGroup" );
H5GroupId subGroupID = H5G.create( groupID,"SubTestGroup" );
ここで取得した"H5GroupId"クラスを"H5DataSetId"クラスの作成時に使用すれば、任意のグループ内にデータを作成することができる。グループを閉じる順序は、最後に開いたグループから順に閉じていく。

以下、グループ作成を交えたサンプル
H5FileId fileID = H5F.create("C:\\Test.hdf5" , H5F.CreateMode.ACC_TRUNC );
H5GroupId groupID = H5G.create( fileID,"TestGroup" );
H5GroupId subGroupID = H5G.create( groupID,"SubTestGroup" );
H5DataSpaceId spaceID = H5S.create_simple( 1, new long[] { 1 } ); H5DataTypeId typeID = H5T.copy( H5T.H5Type.NATIVE_DOUBLE ); H5DataSetId datasetID = H5D.create( subGroupID, "PI", typeID, spaceID ); H5D.write<double>( datasetID, typeID, new H5Array<double>( new double[]{ 3.14152649 } ) );
H5D.close( datasetID );
H5T.close( typeID );
H5S.close( spaceID );
H5G.close( subGroupID );
H5G.close( groupID );
H5F.close( fileID );

HDF5DotNet : 文字列の書き込み2013年02月08日 08:18

文字列の書き込み方法について
文字列を書き込む方法はちょっと特殊。

基本は前回の"HDF5 : 値の追加"と同じ方法であるが、C#にある"string"型が使用できない。まずは、"string"型を"byte[]"型にして、"byte"型の配列にしてやる。
"string"型を"byte[]"型に変換するには"UTF8Encoding"クラスなどの"GetBytes"メソッドを使用する。
string stringValue = "This is TestString.";
UTF8Encoding
 uni = new System.Text.UTF8Encoding( ); Byte[] byteArray = uni.GetBytes( stringValue );
まずはSpaceの作成。ここも少し特殊。書き込みは"byte[]"型であるが、文字列ひとつを一つの型と認識させるので、Spaceの定義は以下のようになる。 
H5DataSpaceId spaceID = H5S.create_simple( 1new long[] { 1 } );
続いて型の定義。基本通り"H5DataTypeId"を作成するが、上記に書いた通り、文字列を一つの型と認識させる必要がある。型の大きさを指定する場合は"H5T"クラスの"create"メソッドを使用する。
引数は以下のように
 "createClass" : "H5T.CreateClass"列挙型を指定。
 "size" : int型、型の大きさを指定する。
文字列を書き込む場合は"H5T.CreateClass"列挙に"STRING"があるので、それを使用する。sizeは上記で取得したbyte[]の配列長さを指定する。型の定義は以下のようになる。
H5DataTypeId typeID = H5T.create(H5T.CreateClass.STRING,byteArray.Length );
また、前回の型定義方法でも可能。"H5T"クラス"copy"メソッドで使用する型定義は"C_S1"の列挙型を指定する。定義後はサイズ指定をする必要がある。
サイズを指定する場合は、"H5T"クラスの"setSize"メソッドを使用する。引数は以下の通り。
 "typeId" : "H5DataTypeId"クラス、同じ"H5T"クラスのメソッド"copy"メソッドで作成した型情報を渡す。
 "size" : "int型"、型のサイズを指定する。
H5DataTypeId typeID = H5T.copy( H5T.H5Type.C_S1 );
H5T.setSize( typeID, byteArray.Length );
後は、数値の書き込みと同じように、"H5DataSetId"を作成して、"H5D"クラスの"write<>"メソッドで書き込む。書き込む内容は上記で取得したbyte[]。
H5DataSetId datasetID = H5D.create( fileID, "Test", typeID, spaceID );
H5D.write<byte>( datasetID, typeID, new H5Array<byte>( byteArray ) );
書き込み終了後は、各ID作成クラスにある"close"メソッドで後処理を行う。
ちなみにこの方法で作成すると、HDFViewでlengthが固定になってしまう。HDFViewで編集することもできるが、lengthを超える値を保存しようとすると、超えた部分は保存されない。
以下、サンプルプログラム
H5FileId fileID = H5F.create("C:\\Test.hdf5" , H5F.CreateMode.ACC_TRUNC );
string stringValue = "This is TestString.";

UTF8Encoding
 uni = new System.Text.UTF8Encoding( ); Byte[] byteArray = uni.GetBytes( stringValue ); H5DataSpaceId spaceID = H5S.create_simple( 1new long[] { 1 } ); H5DataTypeId typeID = H5T.create( H5T.CreateClass.STRING, byteArray.Length ); H5DataSetId datasetID = H5D.create( fileID, "Test", typeID, spaceID ); H5D.write<byte>( datasetID, typeID, new H5Array<byte>( byteArray ) );
H5D.close( datasetID );
H5T.close( typeID ); 
H5S.close( spaceID );
H5F.close( fileID );

HDF5DotNet : 値の追加2013年02月07日 12:13

値の追加方法

値を追加するにはいくつかの手順を踏む必要がある。
1 : 占有スペースの定義作成
2 : 書き込む型の定義作成
3 : 占有スペースと型の定義を合わせた書き込み定義の作成
4 : データの作成
5 : 書き込み
6 : 各IDの処理

1 : 占有スペースの定義作成
 ファイル内にデータを保存するためのスペースを決めるために作成する
 スペース定義を作成するには、"H5S"クラスにある"create_simple”メソッドを使用する。引数は以下の通り
  "rank" : "int"型、配列の次元数を指定。
  "dims" : "long[]"型、配列の大きさを指定する。
 戻り値は"H5DataSpaceId"クラス。使用後に同じクラス内の"close"メソッドで閉じる必要があるので、とっておく。
 サンプルとして、一つの値を書き込む場合は以下のようにする。
H5DataSpaceId spaceID = H5S.create_simple( 1new long[] { 1 } ); 
2 : 書き込む型の定義作成
 型情報を定義して、スペースの区切りを定義する
 型を定義するには"H5T"クラスの"copy"メソッドを使用する。引数は"H5T.H5Type"の列挙より選択。色々な型がある。今回はint型なので"NATIVE_INT"を使用。
 戻り値は"H5DataTypeId"クラス、もちろん使用後に同じクラス内の"close"メソッドで閉じるなければならないのでとっておく。
  以下、サンプル。
H5DataTypeId typeID = H5T.copy( H5T.H5Type.NATIVE_INT );
3 : 占有スペースと型の定義を合わせた書き込み定義の作成
 上記1,2を使用して書き込み定義を作成する。
 定義には"H5D"クラスの"create"メソッドを使用する。引数は4つ
  "groupOrFileId" : "H5FileOrGroupId”クラス、H5FileIdかH5GroupIdを指定する。今回は前者を指定。
  "dataSetName" : "string"型を指定、データの名前を指定する。
  "dataTypeId" : "H5DataTypeId"クラスを指定。上記2を指定する。
  "dataSpaceId" : "H5DataSpaceId"クラスを指定。上記1を指定する
 戻り値は"H5DataSetId"クラス、書き込み時に必要なのでとっておく。
 以下、サンプル。
H5DataSetId setID = H5D.create( fileID, "Index",typeID,spaceID );
4 : データの作成
 書き込みの関数にて、必要になる"H5Array<>"クラスを作成する。このクラスは見ての通りジェネリッククラスなので、書き込みするデータの型を指定する。サンプルはint型を使用。
 引数はジェネリック指定した型の配列なので、配列を用意する必要がある。
 配列は32次元まで指定できる。
   以下、サンプル。
H5Array<int> data = new H5Array<int>new int[]{1} );
5 : 書き込み
 ここまでできたなら、最後は"H5D"クラス内の”write<>”メソッドで書き込む。
 ジェネリックメソッドなので、使用する型を入れる(今回はint型)。
 引数は以下の通り。
  "dataSetId" : "H5DataSetId"クラスを指定、上記3にて作成
  "memTypeId" : "H5TypeId"クラスを指定、上記2で作成したものを使用する
  "data" : "H5Array<>"クラスを指定
 以下、サンプル。
H5D.write<int>(SetID,typeID,data);

6 : 各IDの処理
 書き込みが終われば、IDを各クラスの"close"メソッドで閉じる。

備考:
 ・数値型であれば、"int"型の部分を変えれば基本応用が利く。
  その際は、型定義時の"H5T.H5Type"列挙型を適切なものを選択する。
  ("double"型なら"NATIVE_DOUBLE"とか)

 ・例外で、C#の"decimal"型につていは使用できないので注意。

以下、今回のサンプル
///////////////////////////////////////////////////////////////////////////////////////////

H5FileId fileId =  H5F.create("C:\\HDFSampleFile.hdf5",H5F.CreateMode.ACC_CREAT );//    ファイル作成
//H5FileId fileId = H5F.open("C:\\HDFSampleFile.hdf5", H5F.OpenMode.ACC_RDWR);      //  ファイルオープン

H5DataSpaceId spaceID = H5S.create_simple(1,new long[]{1});//   スペース作成
H5DataTypeId typeID = H5T.copy(H5T.H5Type.NATIVE_INT);//    型作成
H5DataSetId setID = H5D.create(fileId,"Index",typeID,spaceID);  //書き込み定義作成
H5Array<int> data = new H5Array<int>(new int[]{1});    //  データの作成
H5D.write<int>(setID, typeID, data);   //書き込み
//各IDを閉じる
H5D.close(setID);
H5T.close(typeID);
H5S.close(spaceID);

H5F.close(fileId); //   ファイルを閉じる 

/////////////////////////////////////////////////////////////////////////////////////////// 

HDF5DotNet : ファイルの作成と読み込み2013年02月06日 22:31

前回の導入を行えれば、VisualStudioで作成可能になる

まずは上部にusingで参照可能にする

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05 using System.Threading.Tasks;
06 using HDF5DotNet;

ファイルを作成する場合は、”H5F”クラスの”create”メソッドを使用する。
引数は”作成するファイル名”と"作成タイプ"、
ファイル名は適当に指定。”作成タイプ”は"H5F.CreateMode"の列挙から”ACC_CREAT”を使用する。

戻り値に"H5FileId”が帰ってくる。これはファイルを閉じる際に使用するのでとっておく。

  H5FileId fileId =  H5F.create("C:\\HDFSampleFile.hdf5",H5F.CreateMode.ACC_CREAT );

閉じる際は、とっておいた"H5FileId"を使用して、"H5F.close"メソッドを使用する
引数は"H5FileId"

H5F.close(fileId);

これで空ののHDF5ファイルが作成できる。
できたファイルを"HDFView"にて確認(画面左のツリーを確認してほしい)

static void Main(string[] args)
{
    H5FileId fileId =  H5F.create("C:\\HDFSampleFile.hdf5",H5F.CreateMode.ACC_CREAT );
    H5F.close(fileId
 );
}

読み込む際は"H5F"クラスの"open"メソッドを使用する。
引数は、開くファイル名と、"H5F.OpenMode"の列挙より選択。"ACC_RDONLY"で読み込み専用、"ACC_RDWR"で書き込みもできる。
戻り値は作成と同じく"H5FileId"なので、閉じるまでとっておく。
ファイルを閉じる際は同じく"H5F.close"メソッドを使用

static void Main(string[] args)
{
    H5FileId fileId =  H5F.open("C:\\HDFSampleFile.hdf5",H5F.OpenMode.ACC_RDONLY );
    H5F.close(fileId
 );
}

次回は簡単な値の書き込み