首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取和操作HDF5文件

读取和操作HDF5文件
EN

Stack Overflow用户
提问于 2013-02-08 05:34:32
回答 2查看 5.1K关注 0票数 1

我在HDF5 Example code上发现了类似的问题

但是我在正确查看hdf5数据集内容时遇到了问题。

我正在查看的数据集包含字符串头,第一列中有字符串,其他列中有两个字符串。

下面是我的代码:

代码语言:javascript
复制
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的数据类型更改为object,但这仍然不能提供dataset的确切内容。

我得到的wrapArray输出如下所示:

代码语言:javascript
复制
[0,0] 4.0633928641260729E+87  
[0,1] 9.77854726248995E-320  
[0,2] 1.52021104712121E-312  

等。

但我想要的是:

代码语言:javascript
复制
[0,0] Event1  
[0,1] 2  
[0,2] 56  

等。

在读取数据集之后,我想遍历第一列以查找特定的字符串,并在其他列中获得相应的元素。但我必须弄清楚这件事。

EN

回答 2

Stack Overflow用户

发布于 2013-07-02 22:28:21

对我来说,它的工作方式是简单地检查DataSet的实际数据类型(使用HDFView),然后生成包含该数据类型的数组,而不是双精度数。

票数 0
EN

Stack Overflow用户

发布于 2015-04-23 04:52:45

John,如果数据集有一列用字符串值填充,seccond列用双精度值填充,那么数据集是由“复合”类型构成的。然后事情就有点复杂了(据我今天所知..我是HDF5的新手)不可能简单地将值加载到二维数组中。相反,您必须:

代码语言:javascript
复制
//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...

  }

我没有测试这段代码。这是我为你的案子重写的。希望这能有所帮助。

菲利普

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14761412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档