使用 Java 从 HDF5 文件中的 NetCDF 字符数组变量中检索一维数组

Posted

技术标签:

【中文标题】使用 Java 从 HDF5 文件中的 NetCDF 字符数组变量中检索一维数组【英文标题】:Retrieving 1D arrays from NetCDF char array variables in HDF5 files using Java 【发布时间】:2013-04-26 00:16:27 【问题描述】:

使用 NetCDF 的 Java API,我有一个带有 CHAR 类型数组的 HDF5 文件,根据documentation,它类似于仅包含 ASCII 字符的字符串:“char 类型包含未解释的字符,每个字节一个字符. 通常这些包含 7 位 ASCII 字符。”在 HDFView 中,数组中的其中一个值的示例是“13”。

我知道对于整数数组,我可以将它们全部作为 Java 数组获取,如下所示:

int[] data = (int[]) netCDFArray.get1DJavaArray(int.class);

但是如何取回这个 CHAR 类型的数组呢?不幸的是,我引用的文档没有帮助。

以下不可能是正确的,因为有些项目是多于单个字符的:

char[] data = (char[]) netCDFArray.get1DJavaArray(char.class);

以下尝试都抛出ForbiddenConversionException

char[] data = (char[]) netCDFArray.get1DJavaArray(char.class);
char[][] data = (char[][]) netCDFArray.get1DJavaArray(char[].class);
String[] data = (String[]) netCDFArray.get1DJavaArray(String.class);

如果我使用netCDFArray.toString(),我会看到我的字符串数组,因为ArrayChar 使用StringIterator。我想我也可以使用这样的迭代器并对每个字符串做一些事情。但我不需要获取 int 迭代器来检索整数。如何一次有效地检索 CHAR 类型的所有字符串,类似于我如何检索整数(见上文)?我会满足于检索 Java Strings[]CharSequence[]char[][]

【问题讨论】:

【参考方案1】:

似乎 CHAR 类型的 NetCDF 字符串在逻辑上表示为char 类型的二维数组,但在内部它存储为char 类型的单个数组。因此,最有效的数据检索方式如下:

char[] data = (char[]) netCDFArray.get1DJavaArray(char.class);

然后必须从这个单一数组中提取单个字符串:

assert netCDFArray.getRank()==2 : "Expected a two-dimensional logical array of chars.";
int stringLength=netCDFArray.getShape()[1];
int stringCount=netCDFArray.getShape()[0];
//iterate through stringCount positions of stringLength length

增加的转折是字符串显然是以零结尾的,也就是说,假定的固定长度字符串显然可能是使用 ASCII 0 作为分隔符的小于 stringLength 的可变长度字符串.我从代码中得出这个;我在documentation 中找不到它。

【讨论】:

以上是关于使用 Java 从 HDF5 文件中的 NetCDF 字符数组变量中检索一维数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HDF5 文件中读取属性?

如何从 C++ 中的 hdf5 文件中读取数据块?

如何在带有 NetBeans 的 Windows Java 项目中使用 HDF5

是否可以从 Python 的 HDF5 文件中的复合数据集中读取字段名称?

Java hdf5 库安装

用于读取 HDf5 错误的 Netcdf java 库