2017-04-24 1 views
0

Y at-il un moyen, comment définir les noms de colonnes dans le fichier h5?C++ - définir les noms des colonnes dans HDF5

Je peux le faire avec un type de données composé ou cela pourrait probablement être fait en utilisant H5Table.

Une option consiste également à créer des attributs et à enregistrer des noms de colonnes de cette manière.

Mais les matrices habituelles de type de données unique ne peuvent pas avoir de colonnes nommées, n'est-ce pas? Autant que je sache, vous ne pouvez pas définir le nom de la colonne dans un type de données atomique

Répondre

1

Comme vous avez vu l'astuce de H5Table est qu'il crée un type de données compund où il y a un champ pour chaque "colonne". LINK.

Si j'étais vous j'écrirais les noms de colonnes dans un attribut (tableau de chaînes) et garderais le type de données simple.

Pour créer une liste de chaînes en C++ je fais comme suit:

H5::H5File m_h5File; 
m_h5File = H5File("MyH5File.h5", H5F_ACC_RDWR); 
DataSet theDataSet = m_h5File.openDataSet("/channel001"); 
H5Object * myObject = &theDataSet; 

//The data of the attribute. 
vector<string> att_vector; 
att_vector.push_back("ColName1"); 
att_vector.push_back("ColName2 more characters"); 
att_vector.push_back("ColName3"); 
const int RANK = 1; 
hsize_t dims[RANK]; 
StrType str_type(PredType::C_S1, H5T_VARIABLE); 
dims[0] = att_vector.size(); //The attribute will have 3 strings 
DataSpace att_datspc(RANK, dims); 
Attribute att(myObject->createAttribute("Column_Names" , str_type, att_datspc)); 

vector<const char *> cStrArray; 
for(int index = 0; index < att_vector.size(); ++index) 
{ 
    cStrArray.push_back(att_vector[index].c_str()); 
} 
//att_vector must not change 
att.write(str_type, (void*)&cStrArray[0]);