我如何在不同列具有不同类型的地方存储数据集?

问题描述 投票:2回答:1

假设我有一个包含不同列的表。这些列具有不同的类型。例如:

col1,   col2,   col3
1.1    "hello"   1
2.2    "world"   2
...

这里col1floatdoublecol2stringcol3int。现在,我想使用C ++将这些数据存储在hdf5文件中。我该怎么办?

我已经发现this post对于Python也有相同的问题。但是我无法弄清楚如何在C ++中执行此操作,因为据我发现,您必须为整个数据集指定类型。

编辑:有没有一种方法可以让一列包含数组,比方说整数数组?例如:

col1,   col2,   col3,   col4
1.1    "hello"   1     {1, 3}
2.2    "world"   2     {1, 2, 3}
...
c++ hdf5
1个回答
0
投票

[请查看HDFql,因为它可以减轻处理HDF5复合数据集的底层细节。在C ++中使用HDFql,您的问题可以通过以下方式解决:

// define structure
struct data
{
    float col1;
    char *col2;
    int col3;
    HDFQL_VARIABLE_LENGTH col4;
};


// declare variables
char script[1024];
struct data values[2];
int *address;


// create a dataset named "my_dataset" of data type compound of one dimension (size 2) composed of four members (col1, col2, col3 and col4)
HDFql::execute("CREATE DATASET my_dataset AS COMPOUND(col1 AS FLOAT, col2 AS VARCHAR, col3 AS INT, col4 AS VARINT)(2)");


// populate variable "values"
values[0].col1 = 1.1;
values[0].col2 = (char *) malloc(10);
strcpy(values[0].col2, "hello");
values[0].col3 = 1;
address = (int *) malloc(2 * sizeof(int));
*address = 1;
*(address + 1) = 3;
values[0].col4.address = address;
values[0].col4.count = 2;

values[1].col1 = 2.2;
values[1].col2 = (char *) malloc(10);
strcpy(values[1].col2, "world");
values[1].col3 = 2;
address = (int *) malloc(3 * sizeof(int));
*address = 1;
*(address + 1) = 2;
*(address + 2) = 3;
values[1].col4.address = address;
values[1].col4.count = 3;


// insert (i.e. write) values from variable "values" into dataset "my_dataset"
sprintf(script, "INSERT INTO my_dataset VALUES FROM MEMORY %d SIZE %d OFFSET(%d, %d, %d, %d)", HDFql::variableTransientRegister(values), sizeof(struct data), offsetof(struct data, col1), offsetof(struct data, col2), offsetof(struct data, col3), offsetof(struct data, col4));
HDFql::execute(script);

[可选,您可以使数据集在其第一维上可扩展(通过声明其大小不受限制),然后写一行,用一个单位扩展维,写另一行,用一个单位扩展维,依此类推。 ..

可在reference manual中找到有关如何使用HDFql的其他详细信息和示例。

© www.soinside.com 2019 - 2024. All rights reserved.