我的 HDF5 文件的属性需要一个字符串值
Need a string value on an Attribute on my HDF5 File
我正在尝试在我的数据集上添加一些属性并且它工作正常,但是我在写入属性值时遇到一个问题,我需要它们是一个字符串,而不是 INT 或 float 或其他什么,我在互联网上找到的每个教程都对这些属性使用 int 值。
我尝试了很多不同的东西,其中 none 效果很好,代码变得非常丑陋,这是我的代码:
foreach (BasicVariable bv in pf.basicVariableList.bvList)
{
H5DataSetId dataSetId = H5D.create(bvGroupId, bv.bvTag, typeId, spaceId);
bv.atribList.Add(new Atribbs("Eng. Unit", "Temperatura"));
bv.atribList.Add(new Atribbs("Atrib2", "Teste"));
foreach(Atribbs a in bv.atribList )
{
H5DataTypeId auxDT = H5T.copy(H5T.H5Type.C_S1);
H5T.setSize(auxDT, H5T.getSize(H5T.H5Type.C_S1));
const int auxData = 2;
long[] auxDim = new long[1];
auxDim[0] = 1;
H5DataSpaceId auxDS = H5S.create_simple(1, auxDim);
var attr_id = H5A.create(dataSetId, a.attName, auxDT, auxDS);
byte[] bytes = Encoding.UTF8.GetBytes(a.valueStr);
var atrData = new string[] { Encoding.Default.GetString(bytes)};
H5A.write<string>(attr_id, auxDT, new H5Array<string>(atrData));
H5A.close(attr_id);
}
H5D.close(dataSetId);
}
H5F.close(fileId);
我创建的属性是 "Eng. Unit" 和 "Atrib2" 并且工作正常,问题是 "Eng. Unit" 应该具有 "Temperatura" 值和 "Atrib2" 应该有 "Teste" 作为它的价值,这就是我在 hdfl 查看器上得到的
enter image description here
enter image description here
也许您想看看 HDFql,它大大简化了 HDF5 文件的处理方式。这是在 C# 中使用 HDFql 的解决方案(假设 HDF5 文件名为 test.h5
,数据集名为 dset
):
HDFql.Execute("USE FILE test.h5"); // use (i.e. open) HDF5 file "test.h5"
HDFql.Execute("CREATE ATTRIBUTE \"dset/Eng. Unit\" AS VARCHAR VALUES(Temperatura)"); // create attribute "Eng. Unit" in dataset "dset" with an initial value of "Temperatura"
HDFql.Execute("CREATE ATTRIBUTE dset/Atrib2 AS VARCHAR VALUES(Teste)"); // create attribute "Atrib2" in dataset "dset" with an initial value of "Teste"
我正在尝试在我的数据集上添加一些属性并且它工作正常,但是我在写入属性值时遇到一个问题,我需要它们是一个字符串,而不是 INT 或 float 或其他什么,我在互联网上找到的每个教程都对这些属性使用 int 值。 我尝试了很多不同的东西,其中 none 效果很好,代码变得非常丑陋,这是我的代码:
foreach (BasicVariable bv in pf.basicVariableList.bvList)
{
H5DataSetId dataSetId = H5D.create(bvGroupId, bv.bvTag, typeId, spaceId);
bv.atribList.Add(new Atribbs("Eng. Unit", "Temperatura"));
bv.atribList.Add(new Atribbs("Atrib2", "Teste"));
foreach(Atribbs a in bv.atribList )
{
H5DataTypeId auxDT = H5T.copy(H5T.H5Type.C_S1);
H5T.setSize(auxDT, H5T.getSize(H5T.H5Type.C_S1));
const int auxData = 2;
long[] auxDim = new long[1];
auxDim[0] = 1;
H5DataSpaceId auxDS = H5S.create_simple(1, auxDim);
var attr_id = H5A.create(dataSetId, a.attName, auxDT, auxDS);
byte[] bytes = Encoding.UTF8.GetBytes(a.valueStr);
var atrData = new string[] { Encoding.Default.GetString(bytes)};
H5A.write<string>(attr_id, auxDT, new H5Array<string>(atrData));
H5A.close(attr_id);
}
H5D.close(dataSetId);
}
H5F.close(fileId);
我创建的属性是 "Eng. Unit" 和 "Atrib2" 并且工作正常,问题是 "Eng. Unit" 应该具有 "Temperatura" 值和 "Atrib2" 应该有 "Teste" 作为它的价值,这就是我在 hdfl 查看器上得到的 enter image description here
enter image description here
也许您想看看 HDFql,它大大简化了 HDF5 文件的处理方式。这是在 C# 中使用 HDFql 的解决方案(假设 HDF5 文件名为 test.h5
,数据集名为 dset
):
HDFql.Execute("USE FILE test.h5"); // use (i.e. open) HDF5 file "test.h5"
HDFql.Execute("CREATE ATTRIBUTE \"dset/Eng. Unit\" AS VARCHAR VALUES(Temperatura)"); // create attribute "Eng. Unit" in dataset "dset" with an initial value of "Temperatura"
HDFql.Execute("CREATE ATTRIBUTE dset/Atrib2 AS VARCHAR VALUES(Teste)"); // create attribute "Atrib2" in dataset "dset" with an initial value of "Teste"