c++ - HDF5 将字符串头写入文件

标签 c++ string hdf5

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

TimeStamp    Property1      Property2

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

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

['时间戳'、'属性1'、'属性2']

...并将其标记到列中以便于以后使用(我计划在 Python 中分析矩阵)。如何做到这一点?

我尝试使用 H5Dwrite 写入字符串数组但失败了,我猜它需要一致的数据类型,所以它只需要 float ,这是我的数据的数据类型。然后我读到了有关元数据的内容,但我对如何使用它有点迷失?任何帮助将不胜感激。

一个相关的附带问题是矩阵的第一行可以是字符串而其他行可以包含 double 吗?

最佳答案

干净的解决方案

如果将数据存储为 compound datatype 的一维数组包含成员 TimeStampProperty1Property2 等,那么字段名称将存储为元数据,并且应该很容易在 Python 中读取。

我认为还有另一个干净的选项,但我只会提到它,因为我自己从未使用过它:HDF5's Table Interface 。阅读文档,看看您是否愿意使用它。

直接回答您的问题

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

A related side question is can the first row of a matrix be a string and the others rows contain doubles?

没有。

使用复合数据类型的示例

假设您有一个如下定义的结构:

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

和一个 vector :

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);

关于c++ - HDF5 将字符串头写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451900/

相关文章:

c++ - 使用库中的代码时变量周围的堆栈已损坏

python - Python 中的连续子字符串

python - Pandas read_hdf 按日期和时间范围查询

python - 属性错误: type object 'h5py.h5r.Reference' has no attribute '__reduce_cython__' on using "from keras.utils import HDF5Matrix"

c++ - 自定义 QProcess 对象在返回前等待输出

c++ - 如何将 C++11 随机数生成器传递给函数?

c++ - _iterator_debug_level 值 '0' 与值 '2' 不匹配

JavaScript:需要查找给定字符串中多个子字符串中的哪一个已被选择(突出显示)

python - 根据相似性替换字符串

python - 如何将 Pandas DataFrame 存储为 HDF5 PyTables 表(或 CArray、EArray 等)?