C#操作HDF5文件


需要先依赖添加:

dll链接:https://pan.baidu.com/s/1U4gtQXWsI-ElxEbn8PA06g

提取码:9999

然后在VS中引入对应包,如下图

 

先介绍一下几个H5类的区别

H5D    数据操作
H5F    文件操作
H5S    矩阵空间操作
H5T    数据类型操作

接下来先介绍文件读取方法,相对略简单

       //定义文件路径
            string filename = "111.h5";
            //新建dataset
            GetHdf5DataSet getData = new GetHdf5DataSet();
            //获取目录数组
            string[] groupNames = getData.hdf5_getData(filename);
            //只读模式打开
            H5FileId fileId = H5F.open(filename, H5F.OpenMode.ACC_RDWR);
            //取其中某一目录
            H5DataSetId dataSetId = H5D.open(fileId, groupNames[0]);
            //获取目录的spaceid
            H5DataSpaceId h5DataSpaceId = H5D.getSpace(dataSetId);
            //查询目录在h5位置
            int rank = H5S.getSimpleExtentNDims(h5DataSpaceId);
            //查询目录矩阵大小
            long[] a = H5S.getSimpleExtentDims(h5DataSpaceId);
            //建立对应大数组
            double[,] readDataBack = new double[a[0], a[1]];
            //目录数据存入内存
            H5D.read(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE), new H5Array<double>(readDataBack));

然后是写入方法,HDF5可以创建嵌套的目录结构,创建方法如下图

            //文件句柄
            H5FileId file;
            //创建文件,存在则覆盖写入
            file = H5F.create("5.h5", H5F.CreateMode.ACC_TRUNC);
            //创建多层级子目录
            H5GroupId groupId = H5G.create(file, "children01");
            H5GroupId groupId03 = H5G.create(file, "children04");
            H5GroupId subGroup = H5G.create(groupId, "children02");
            H5GroupId subGroup01 = H5G.create(subGroup, "children03");
            H5G.close(subGroup01);
            H5G.close(groupId03);
            H5G.close(subGroup);
            H5G.close(groupId);
            H5F.close(file);            

目录效果

 

 接下来是完整的数据写入

string fime_name = "new_write.h5";
            H5FileId fileId = H5F.create(fime_name, H5F.CreateMode.ACC_TRUNC);
            long[] dims = new long[1];
            dims[0] = 10;

            //一维数据准备
            int[] data_one_demo = new int[10];
            for (int i = 0; i < 10; i++)
            {
                data_one_demo[i] = i;
            }
            
            //二维数据准备
            int[,] data_two_demo = new int[10, 10];
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    data_two_demo[i, j] = i * j;
                }
            }

            //三维数据准备
            int[,,] data_three_demo = new int[10, 10, 10];
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        data_three_demo[i, j, k] = i * j * k;
                    }
                }
            }

            H5DataSpaceId spaceId = H5S.create_simple(1, dims);
            H5DataTypeId typeId = H5T.copy(H5T.H5Type.NATIVE_INT);
            
            // 获取数据类型占用空间
            int typeSize = H5T.getSize(typeId);
            
            //不知道干啥的两句,注释了似乎也没影响
            H5T.setOrder(typeId, H5T.Order.BE);
            H5T.setOrder(typeId, H5T.Order.LE);

            // 创建h5一维数据块
            H5DataSetId dataSetId = H5D.create(fileId, "/data_01", typeId, spaceId);
            // 创建h5二维数据块
            H5DataSetId dataSetId_two_demo = H5D.create(fileId, "/data_02", typeId, H5S.create_simple(2, new long[2]{10,10}));
            // 创建h5三维数据块
            H5DataSetId dataSetId_three_demo = H5D.create(fileId, "/data_03", typeId, H5S.create_simple(3, new long[3] { 10, 10 ,10}));

            // 一维写入
            H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int>(data_one_demo));
            
            // 二维写入
            H5D.write(dataSetId_two_demo, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int>(data_two_demo));

            // 三维写入
            H5D.write(dataSetId_three_demo, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int>(data_three_demo));

            //必须关闭全部句柄
            H5D.close(dataSetId);
            H5D.close(dataSetId_two_demo);
            H5D.close(dataSetId_three_demo);
            H5S.close(spaceId);
            H5T.close(typeId);
            H5F.close(fileId);
            
            //带初始种子的随机写入
            //int singleValue = 999999;
            //H5D.writeScalar(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT),ref singleValue);

效果如下:

(九九乘法表)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM