2013-02-07 123 views
1

我在HDF5 Example code
處發現了類似的問題,但我無法正確查看hdf5數據集的內容。在HDF5文件中讀取和操作

我正在查看的數據集包含字符串標題,其中第一列爲字符串,其他列爲雙精度字符串。

這裏是我的代碼如下所示:

public static void readh5(string path, string filename) 
{ 
    H5.Open(); 
    var fileID = H5F.open(path + filename, H5F.OpenMode.ACC_RDONLY); 

    var groupID = H5G.open(fileID, "/Example Group/"); 
    var datasetID = H5D.open(groupID, "Events"); 
    var dataSpace = H5D.getSpace(datasetID); 
    var size = H5S.getSimpleExtentDims(dataSpace); 
    var dataType = H5D.getType(datasetID); 

    double[,] dataArray = new double[size[0],11]; 
    var wrapArray = new H5Array<double>(dataArray); 
    H5D.read(datasetID, dataType, wrapArray); 
    Console.WriteLine(wrapArray); 
} 

當我調試,並考慮wrapArray每一個元素是一個令人難以置信的大或小的雙打在價值10^300至10^-300,我不知道爲什麼。我不認爲這些是元素的ID號碼。我試着將wrapArray和dataArray的數據類型更改爲對象,但仍然沒有給出數據集的確切內容。

我得到wrapArray輸出看起來像:

[0,0] 4.0633928641260729E+87 
[0,1] 9.77854726248995E-320 
[0,2] 1.52021104712121E-312 

但我想要的是:

在看完後我想通過第一列循環查找特定字符串的數據集,並獲取相應的元素nts在其他列中。但我必須弄清楚這一點。

回答

0

對我來說,它只是簡單地檢查DataSet的實際數據類型(使用HDFView),然後創建包含該數據類型而不是雙精度的數組。

0

John, 如果數據集的一列填充字符串值,第二列填充雙值,則數據集由「COMPOUND」類型組成。事情有點複雜,然後(從我今天知道的...我是HDF5的新手)不可能簡單地加載值到二維數組。相反,你必須:

//1) Define byte array in memory. We know that it is one string and two doubles. 
//Check that string in dataset is really 256 chars long. 
int rows = size[0]; //this should be number of rows in dataset. 
int oneRowDataSize = 256+8+8; //string+double+double 
byte[] data_to_read = new byte[oneRowDataSize * rows]; 

// 2) Read data to our byte array 
H5D.read(datasetID, dataType, new H5Array<byte>(data_to_read)); 

// 3) Decompose our byte array to rows and individual values 
for (int m = 0; m < rows; m++) 
    { 

//4) offset of the row in the byte array 
     int pos = m*oneRowDataSize; 

//5) compute individual offsets 
     int posString = pos; 
     int posDouble1 = pos + 256; //change the 256 to the correct size of string in dataset 
     int posDouble2 = pos + 256 + 8; 

//6) convert bytes to values 
    string valString = Encoding.UTF8.GetString(data_to_read, posString, 256); 
    double valDouble1 = BitConverter.ToDouble(data_to_read, posDouble1); 
    double valDouble2 = BitConverter.ToDouble(data_to_read, posDouble2); 

//7 And use these values for your csharp lists/arrays... 

    } 

我沒有測試這段代碼。這只是從我的重寫你的情況。希望這會有所幫助。

Filip

+0

John沒有問這個問題。一般來說,你不需要像信件那樣格式化答案。歡迎來到堆棧溢出!您可以點擊您的答案下面的編輯來更改它。 –