Нужно строковое значение в атрибуте моего файла HDF5 - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь добавить некоторые атрибуты в мои наборы данных, и это работает нормально, но у меня есть одна проблема при записи значения атрибутов, мне нужно, чтобы они были строкой, а не INT, не float или чем-то, каждый учебникя обнаружил, что в Интернете для этих атрибутов используется значение int. Я пробовал много разных вещей, и ни одна из них не работает хорошо, и код становится очень уродливым, это мой код:

    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 введите описание изображения здесь

введите описание изображения здесь

1 Ответ

0 голосов
/ 05 июня 2018

Возможно, вы захотите взглянуть на HDFql , что значительно упрощает обработку файлов HDF5.Здесь идет решение с использованием HDFql в C # (предположим, что файл 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"
...