HDF5将字符串头写入文件

时间:2014-05-04 02:19:03

标签: string hdf5

我正在尝试用C ++编写HDF5文件。该文件基本上包含以下格式的大型时间序列矩阵

TimeStamp    Property1      Property2

我已成功写入数据,我创建了一个dset并使用了H5Dwrite函数。

现在我的问题是如何创建文件头,换句话说,如果我想将以下数组写入文件...

[' TimeStamp',' Property1',' Property2']

...并将其标记为列以便以后使用(我计划在Python中分析矩阵)。怎么做?

我尝试使用H5Dwrite来编写一个字符串数组但是失败了,我想它想要一致的数据类型,所以它只是想要浮点数,这是我的数据的数据类型。然后我读到了这个元数据的事情,但我有点迷失如何使用它?任何帮助将不胜感激。

一个相关的问题是矩阵的第一行可以是一个字符串而其他行是否包含双精度数?

1 个答案:

答案 0 :(得分:2)

清洁溶液

如果您将数据存储为compound datatype的一维数组,其成员为TimeStampProperty1Property2等,则字段名称将存储为元数据它应该很容易用Python阅读。

我认为还有另一种清洁选择,但我会提到它,因为我自己从未使用它:HDF5's Table Interface。阅读文档,看看您是否愿意使用它。

直接回答您的问题

现在脏选项:您可以将字符串属性添加到现有数据集中。有多种方法可以做到这一点。您可以使用单个字符串属性,其中所有字段名称用分号分隔,或者每列一个属性。我不推荐它,因为那将是非常不标准的。

  

一个相关的问题是矩阵的第一行可以是一个字符串而其他行是否包含双精度数?

没有

使用复合数据类型

的示例

假设你有一个像这样定义的结构:

struct Point { double timestamp, property1, property2; };

Point s的向量:

std::vector<Point> points;

以及数据集dset和适当的内存和文件数据空间,然后您可以创建这样的复合数据类型:

H5::CompType type(sizeof(DataPoint));
type.insertMember("TimeStamp", HOFFSET(Point, timestamp), H5::PredType::NATIVE_DOUBLE);
type.insertMember("Property1", HOFFSET(Point, property1), H5::PredType::NATIVE_DOUBLE);
type.insertMember("Property2", HOFFSET(Point, property2), H5::PredType::NATIVE_DOUBLE);

并将数据写入文件,如下所示:

dset.write(&points[0], type, mem_space, file_space);