From b9e9825722e4a2e0111434099c24b8373698753d Mon Sep 17 00:00:00 2001
From: xingjinshuang <xingjs@qq.com>
Date: 星期二, 10 十二月 2024 16:03:05 +0800
Subject: [PATCH] @xingjs@20241210@添加解析h5文件相关类

---
 src/main/java/com/se/simu/service/IBizH5FileParserService.java         |   46 +++++++++++
 src/main/java/com/se/simu/service/Impl/BizH5FileParserServiceImpl.java |   87 +++++++++++++++++++++
 src/main/java/com/se/simu/controller/BizH5FileParserController.java    |   71 +++++++++++++++++
 src/main/java/com/se/simu/helper/HDF5ReaderHelper.java                 |   10 ++
 4 files changed, 214 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/se/simu/controller/BizH5FileParserController.java b/src/main/java/com/se/simu/controller/BizH5FileParserController.java
new file mode 100644
index 0000000..b1d8bba
--- /dev/null
+++ b/src/main/java/com/se/simu/controller/BizH5FileParserController.java
@@ -0,0 +1,71 @@
+package com.se.simu.controller;
+
+import com.se.simu.domain.vo.R;
+import com.se.simu.service.IBizH5FileParserService;
+import hdf.hdf5lib.exceptions.HDF5LibraryException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * Bize H5 鏂囦欢瑙f瀽鍣ㄦ帶鍒跺櫒
+ *
+ * @author xingjinshuang@smartearth.cn
+ * @date 2024/12/06
+ */
+@Api(tags = "H5 鏂囦欢瑙f瀽鍣ㄦ帶鍒跺櫒")
+@Slf4j
+@CrossOrigin(origins = "*", maxAge = 3600)
+@RestController
+@RequestMapping("/h5")
+public class BizH5FileParserController extends BaseController {
+
+
+    @Resource
+    private IBizH5FileParserService bizH5FileParserService;
+
+    /**
+     * HDF5鏂囦欢 璇存槑
+     */
+    @ApiOperation("HDF5鏂囦欢 璇存槑")
+    @GetMapping("/hdf5-illustrate")
+    public R<Object> hdf5FileIllustrate() throws HDF5LibraryException {
+        String content = "HDF5锛圚ierarchical Data Format version 5锛夋槸涓�绉嶇敤浜庡瓨鍌ㄥ拰缁勭粐澶ч噺鏁版嵁鐨勬枃浠舵牸寮忥紝瀹冩敮鎸侀珮鏁堝湴瀛樺偍鍜屽鐞嗗ぇ瑙勬ā绉戝鏁版嵁鐨勮兘鍔涖�侶DF5 鏄竴绉嶇伒娲荤殑鏁版嵁妯″瀷锛屽彲浠ュ瓨鍌ㄥ绉嶆暟鎹被鍨嬶紝鍖呮嫭鏁板�兼暟鎹�佸浘鍍忋�佽〃鏍肩瓑绛夛紝骞朵笖鍙互鎸夌収灞傜骇缁撴瀯缁勭粐鏁版嵁銆俓n" +
+                "HDF5 鏂囦欢锛堥�氬父浣跨敤 .h5 鎵╁睍鍚嶏級鏄竴绉嶄簩杩涘埗鏂囦欢鏍煎紡锛屽畠鍏锋湁浠ヤ笅鐗圭偣锛歕n" +
+                "1.鐏垫椿鎬э細 HDF5 鏂囦欢鏍煎紡闈炲父鐏垫椿锛屽彲浠ュ瓨鍌ㄥ悇绉嶄笉鍚岀被鍨嬪拰澶у皬鐨勬暟鎹紝浠庣畝鍗曠殑鏁板�兼暟缁勫埌澶嶆潅鐨勫缁存暟鎹泦鍚堛�俓n" +
+                "2.灞傜骇缁撴瀯锛� HDF5 鏂囦欢鏄互灞傜骇缁撴瀯缁勭粐鐨勶紝鍙互鍦ㄦ枃浠朵腑鍒涘缓澶氫釜鏁版嵁闆嗭紙Datasets锛夊拰缁勶紙Groups锛夛紝鍏佽鐢ㄦ埛鏍规嵁闇�姹傜粍缁囧拰绠$悊鏁版嵁銆俓n" +
+                "3.澶氱鏁版嵁绫诲瀷锛� HDF5 鏀寔澶氱鏁版嵁绫诲瀷锛屽寘鎷爣閲忋�佹暟缁勩�佸瓧绗︿覆銆佽〃鏍肩瓑绛夛紝骞朵笖鍙互浣跨敤涓嶅悓鐨勫帇缂╂妧鏈鏁版嵁杩涜鍘嬬缉銆俓n" +
+                "4.楂樻晥鎬ц兘锛� HDF5 鏂囦欢鏍煎紡琚璁$敤浜庨珮鏁堝瓨鍌ㄥ拰澶勭悊澶у瀷鏁版嵁闆嗭紝鍏锋湁楂樻晥鐨勬暟鎹闂拰璇诲啓鎬ц兘銆俓n" +
+                "5.璺ㄥ钩鍙板吋瀹规�э細 HDF5 鏂囦欢鍙互鍦ㄤ笉鍚岀殑鎿嶄綔绯荤粺涓婁娇鐢紝鍏锋湁鑹ソ鐨勮法骞冲彴鍏煎鎬с�俓n" +
+                "HDF5 鏂囦欢閫氬父鐢辩瀛﹁绠椼�佹暟鎹垎鏋愩�佹満鍣ㄥ涔犵瓑棰嗗煙鐨勫簲鐢ㄥ箍娉涗娇鐢紝鐢ㄤ簬瀛樺偍澶ц妯℃暟鎹泦锛屼緥濡傚浘鍍忔暟鎹�佷紶鎰熷櫒鏁版嵁銆佹ā鎷熸暟鎹瓑銆傞�氳繃浣跨敤鍚勭缂栫▼璇█鐨� HDF5 搴撳拰宸ュ叿锛屽彲浠ユ柟渚垮湴璇诲啓鍜屽鐞� HDF5 鏍煎紡鐨勬枃浠躲��";
+        log.info("HDF5鏂囦欢 璇存槑:{}", content);
+        return success(content);
+    }
+
+    /**
+     * 鎵撳紑HDF5鏂囦欢
+     *
+     * @param filePath 鏂囦欢璺緞
+     * @return 鏂囦欢ID
+     */
+    @ApiOperation("鎵撳紑HDF5鏂囦欢")
+    @PostMapping("/open-hdf5-file")
+    public R<Object> openHdf5File(String filePath) throws HDF5LibraryException {
+        return success(bizH5FileParserService.openH5File(filePath));
+    }
+
+    /**
+     * 瑙f瀽HD5鏂囦欢
+     */
+    @ApiOperation("瑙f瀽HD5鏂囦欢")
+    @PostMapping("/parse-hdf5-file")
+    public R<Object> parseHdf5File(String filePath) throws HDF5LibraryException {
+        filePath = "/Users/zhangshan/Desktop/hdf5/data.h5";
+        log.info("瑙f瀽HD5鏂囦欢:{}", filePath);
+        return success(bizH5FileParserService.parseH5File(filePath));
+    }
+
+}
diff --git a/src/main/java/com/se/simu/helper/HDF5ReaderHelper.java b/src/main/java/com/se/simu/helper/HDF5ReaderHelper.java
new file mode 100644
index 0000000..f6ed1aa
--- /dev/null
+++ b/src/main/java/com/se/simu/helper/HDF5ReaderHelper.java
@@ -0,0 +1,10 @@
+package com.se.simu.helper;
+
+public class HDF5ReaderHelper {
+    public static void main(String[] args) {
+
+
+    }
+
+
+}
diff --git a/src/main/java/com/se/simu/service/IBizH5FileParserService.java b/src/main/java/com/se/simu/service/IBizH5FileParserService.java
new file mode 100644
index 0000000..3b4ae8e
--- /dev/null
+++ b/src/main/java/com/se/simu/service/IBizH5FileParserService.java
@@ -0,0 +1,46 @@
+package com.se.simu.service;
+
+import hdf.hdf5lib.exceptions.HDF5LibraryException;
+
+/**
+ * ibiz H5 鏂囦欢瑙f瀽鍣�
+ *
+ * @author xingjinshuang@smartearth.cn
+ * @date 2024/12/06
+ */
+public interface IBizH5FileParserService {
+
+    /**
+     * 鎵撳紑HDF5鏂囦欢
+     *
+     * @param filePath 鏂囦欢璺緞
+     * @return 鏂囦欢ID
+     */
+    long openH5File(String filePath) throws HDF5LibraryException;
+
+
+    /**
+     * 璇诲彇鎸囧畾鏁版嵁闆嗙殑鏁版嵁
+     *
+     * @param fileId      鏂囦欢ID
+     * @param datasetName 鏁版嵁闆嗗悕绉�
+     * @return 鏁版嵁闆嗙殑鍊�
+     */
+    Object readDataset(long fileId, String datasetName);
+
+
+    /**
+     * 鍏抽棴HDF5鏂囦欢
+     *
+     * @param fileId 鏂囦欢ID
+     */
+    void closeH5File(long fileId) throws HDF5LibraryException;
+
+    /**
+     * 瑙f瀽 H5 鏂囦欢
+     *
+     * @param filePath
+     * @return {@link Object}
+     */
+    Object parseH5File(String filePath);
+}
diff --git a/src/main/java/com/se/simu/service/Impl/BizH5FileParserServiceImpl.java b/src/main/java/com/se/simu/service/Impl/BizH5FileParserServiceImpl.java
new file mode 100644
index 0000000..5cd6f5e
--- /dev/null
+++ b/src/main/java/com/se/simu/service/Impl/BizH5FileParserServiceImpl.java
@@ -0,0 +1,87 @@
+package com.se.simu.service.Impl;
+
+import com.se.simu.service.IBizH5FileParserService;
+import hdf.hdf5lib.H5;
+import hdf.hdf5lib.HDF5Constants;
+import hdf.hdf5lib.exceptions.HDF5Exception;
+import hdf.hdf5lib.exceptions.HDF5LibraryException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BizH5FileParserServiceImpl implements IBizH5FileParserService {
+
+
+    @Override
+    public long openH5File(String filePath) throws HDF5LibraryException {
+        long fileId = H5.H5Fopen(filePath, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
+        return fileId;
+    }
+
+    @Override
+    public Object readDataset(long fileId, String datasetName) {
+        // long datasetId = H5.H5Dopen((int) fileId, datasetName, HDF5Constants.H5P_DEFAULT);
+        // long datatypeId = H5.H5Dget_type((int) datasetId);
+
+        int[] data = new int[1]; // 鍋囪鏁版嵁闆嗕负鏁村瀷鏁扮粍
+        // H5.H5Dread((int) datasetId, datatypeId, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, data);
+//
+        // H5.H5Dclose(datasetId);
+        // H5.H5Tclose(datatypeId);
+
+        return data[0];
+    }
+
+    @Override
+    public void closeH5File(long fileId) throws HDF5LibraryException {
+        H5.H5Fclose((int) fileId);
+    }
+
+    @Override
+    public Object parseH5File(String filePath) {
+        String fileName = "D:\\xingjs\\A_daily\\PycharmProjects\\pythonProject\\dev\\example.h5";
+        String datasetName = "dataset2";
+
+
+        try {
+
+
+            // 鎵撳紑.h5鏂囦欢
+            int fileId = H5.H5Fopen(fileName, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
+
+            // 鎵撳紑鏁版嵁闆�
+            int datasetId = H5.H5Dopen(fileId, datasetName, HDF5Constants.H5P_DEFAULT);
+
+            // 鑾峰彇鏁版嵁闆嗙殑鏁版嵁绫诲瀷
+            int datatypeId = H5.H5Dget_type(datasetId);
+            int datatypeSize = H5.H5Tget_size(datatypeId);
+
+            // 鑾峰彇鏁版嵁闆嗙殑鏁版嵁绌洪棿
+            int dataspaceId = H5.H5Dget_space(datasetId);
+            long[] dims = new long[HDF5Constants.H5S_MAX_RANK];
+            H5.H5Sget_simple_extent_dims(dataspaceId, dims, null);
+
+            // 璇诲彇鏁版嵁闆嗙殑鏁版嵁
+            byte[] data = new byte[(int) (dims[0] * datatypeSize)];
+            H5.H5Dread(datasetId, datatypeId, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, data);
+
+            // 鍏抽棴鏁版嵁闆�
+            H5.H5Dclose(datasetId);
+
+            // 鍏抽棴鏂囦欢
+            H5.H5Fclose(fileId);
+
+            // 澶勭悊鏁版嵁
+            // ...
+
+            // 鎵撳嵃鏁版嵁绀轰緥
+            for (int i = 0; i < data.length; i++) {
+                System.out.print(data[i] + " ");
+            }
+        } catch (HDF5Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+}

--
Gitblit v1.9.3