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