a
This commit is contained in:
@@ -0,0 +1,293 @@
|
||||
# 数据导入导出
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
|
||||
- [IOManager.h](file://h/IOManager.h)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [DataOperator.h](file://h/DataOperator.h)
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp)
|
||||
- [IAP-GD10.bat](file://tools/IAP-GD10.bat)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [数据导入导出架构](#数据导入导出架构)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [文件解析与数据映射](#文件解析与数据映射)
|
||||
5. [批处理脚本集成](#批处理脚本集成)
|
||||
6. [错误处理机制](#错误处理机制)
|
||||
7. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
Geomative Studio 提供了全面的数据导入导出功能,支持多种数据格式(Excel、CSV、TXT、URF)的转换。本文档详细描述了CIOManager支持的多种数据格式的导入导出机制,包括文件解析流程、数据映射规则和格式转换策略。文档结合DataOperator类的实现,展示从外部文件读取数据并持久化到数据库的完整流程,以及从数据库导出为指定格式的实现细节。同时提供批处理脚本(如IAP-GD10.bat)与核心功能的集成方式说明,并包含格式不兼容、编码问题和数据丢失预防等错误处理机制。
|
||||
|
||||
## 数据导入导出架构
|
||||
Geomative Studio的数据导入导出功能采用分层架构设计,主要由IOManager、DataOperator和文件操作工具类组成。IOManager负责管理导入导出的整体流程,DataOperator处理具体的数据操作,而各种文件操作类(如COperTxtFile、COperUrfFile)则负责特定格式的文件读写。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "用户界面"
|
||||
UI[数据导入导出界面]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
IOManager[CIOManager]
|
||||
DataOperator[CDataOperator]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
FileOperator[文件操作工具]
|
||||
Database[数据库]
|
||||
end
|
||||
subgraph "文件格式"
|
||||
Excel[Excel文件]
|
||||
CSV[CSV文件]
|
||||
TXT[TXT文件]
|
||||
URF[URF文件]
|
||||
end
|
||||
UI --> IOManager
|
||||
IOManager --> DataOperator
|
||||
DataOperator --> FileOperator
|
||||
FileOperator --> Excel
|
||||
FileOperator --> CSV
|
||||
FileOperator --> TXT
|
||||
FileOperator --> URF
|
||||
DataOperator --> Database
|
||||
Database --> FileOperator
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L79-L95)
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L19-L35)
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L19-L27)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### IOManager类
|
||||
CIOManager类是数据导入导出功能的核心管理器,负责协调整个导入导出流程。它提供了Export和Import两个主要方法,分别处理数据导出和导入操作。在导出过程中,IOManager创建一个新的Access数据库文件,并将项目、测区、测点等数据结构化地导出到该数据库中。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CIOManager {
|
||||
+_ConnectionPtr m_pConnection
|
||||
+ADOX : : _CatalogPtr m_pCatalog
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+CStateProcessor m_stateProcessor
|
||||
+UINT Export()
|
||||
+UINT Import()
|
||||
+_ConnectionPtr CreateExpDatabase(CString szFileName)
|
||||
+void ExportDataToAccdbFile(_ConnectionPtr pExpConnection, CTreeCtrl& dmsTree)
|
||||
+void ExportProjectToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwProID)
|
||||
+void ExportTzToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwTzID)
|
||||
+void ExportRspTdToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwTdID)
|
||||
+void ExportIpspTdToAccdbFile(_ConnectionPtr pExpConnection, DWORD dwTdID)
|
||||
+void ImportProjectToDB(_ConnectionPtr pImpConnection)
|
||||
+void ImportTzToDB(_ConnectionPtr pImpConnection)
|
||||
+void ImportSptToDB(_ConnectionPtr pImpConnection)
|
||||
+void ImportRspTdToDB(_ConnectionPtr pImpConnection)
|
||||
+void ImportIpspTdToDB(_ConnectionPtr pImpConnection)
|
||||
}
|
||||
class CDataOperator {
|
||||
+_ConnectionPtr m_pConnection
|
||||
+CStateProcessor m_stateProcessor
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+DWORD m_dwItemHandle
|
||||
+bool m_BatchExportFlag
|
||||
+UINT ExportIpCETdToExcel(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIp2DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIp3DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIpCETdToCSV(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIp2DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIp3DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIP2DToTxt(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIP3DToTxt(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportIP1DToTxt(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRspCETdToExcel(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRsp2DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRsp3DTdToExcel(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRspCETdToCSV(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRsp2DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRsp3DTdToCSV(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRsp2DTdToUrf(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
+UINT ExportRsp3DTdToUrf(CNavDataView *pNavDataView, CString f_szFileName)
|
||||
}
|
||||
CIOManager --> CDataOperator : "使用"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IOManager.h](file://h/IOManager.h#L15-L49)
|
||||
- [DataOperator.h](file://h/DataOperator.h#L23-L171)
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L35-L98)
|
||||
- [IOManager.h](file://h/IOManager.h#L15-L49)
|
||||
|
||||
### DataOperator类
|
||||
CDataOperator类负责具体的数据操作,包括将数据导出为各种格式(Excel、CSV、TXT、URF)。它通过调用相应的文件操作工具类来实现不同格式的文件写入。该类提供了丰富的导出方法,支持一维、二维和三维电阻率及激电数据的导出。
|
||||
|
||||
**Section sources**
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L79-L95)
|
||||
- [DataOperator.h](file://h/DataOperator.h#L23-L171)
|
||||
|
||||
## 文件解析与数据映射
|
||||
|
||||
### Excel和CSV文件处理
|
||||
Excel和CSV文件的处理通过excel.cpp文件中的类实现。系统使用COM接口与Excel应用程序交互,实现数据的读写操作。对于CSV文件,系统采用文本文件处理方式,通过逗号分隔符解析数据。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始导出]) --> CheckFormat["检查导出格式"]
|
||||
CheckFormat --> |Excel| CreateExcel["创建Excel工作簿"]
|
||||
CheckFormat --> |CSV| CreateCSV["创建CSV文件"]
|
||||
CheckFormat --> |TXT| CreateTXT["创建TXT文件"]
|
||||
CheckFormat --> |URF| CreateURF["创建URF文件"]
|
||||
CreateExcel --> WriteHeader["写入表头"]
|
||||
CreateCSV --> WriteHeader
|
||||
CreateTXT --> WriteHeader
|
||||
CreateURF --> WriteHeader
|
||||
WriteHeader --> GetData["从数据库获取数据"]
|
||||
GetData --> FormatData["格式化数据"]
|
||||
FormatData --> WriteData["写入数据行"]
|
||||
WriteData --> CheckMore["是否有更多数据?"]
|
||||
CheckMore --> |是| WriteData
|
||||
CheckMore --> |否| SaveFile["保存文件"]
|
||||
SaveFile --> End([导出完成])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp#L19-L800)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L100-L112)
|
||||
|
||||
**Section sources**
|
||||
- [excel.cpp](file://cpp/Tools/excel.cpp#L19-L800)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L100-L112)
|
||||
|
||||
### TXT文件处理
|
||||
TXT文件处理由COperTxtFile类负责,该类提供了灵活的文本文件写入功能。系统允许设置参数宽度,确保数据对齐。写入时,不足宽度的部分用空格填充,保证了文件的可读性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "用户界面"
|
||||
participant DataOperator as "CDataOperator"
|
||||
participant OperTxtFile as "COperTxtFile"
|
||||
participant File as "文件系统"
|
||||
UI->>DataOperator : 请求导出TXT文件
|
||||
DataOperator->>DataOperator : 获取选中的测点数据
|
||||
DataOperator->>OperTxtFile : 创建COperTxtFile实例
|
||||
OperTxtFile->>OperTxtFile : 设置参数宽度
|
||||
OperTxtFile->>File : 打开文件进行写入
|
||||
File-->>OperTxtFile : 文件句柄
|
||||
OperTxtFile->>DataOperator : 准备数据数组
|
||||
DataOperator->>OperTxtFile : 提供格式化数据
|
||||
OperTxtFile->>File : 写入数据行
|
||||
loop 每一行数据
|
||||
OperTxtFile->>File : 写入格式化行
|
||||
end
|
||||
OperTxtFile->>File : 关闭文件
|
||||
DataOperator-->>UI : 返回导出结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L19-L166)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L110-L112)
|
||||
|
||||
**Section sources**
|
||||
- [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L19-L166)
|
||||
|
||||
### URF文件处理
|
||||
URF(Universal Resistivity data File)文件处理由COperUrfFile类实现。该类支持多种电极阵列配置的URF文件生成,包括温纳-施伦贝格尔(Wenner-Schlumberger)、交叉孔(Cross Hole)等装置类型。系统根据不同的装置类型生成相应的电极坐标信息。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始URF导出]) --> CheckAR["检查装置类型"]
|
||||
CheckAR --> |温纳-施伦贝格尔| WenSch["生成Wenner-Schlumberger电极坐标"]
|
||||
CheckAR --> |交叉孔| CrossHole["生成Cross Hole电极坐标"]
|
||||
CheckAR --> |自定义| Custom["生成自定义电极坐标"]
|
||||
WenSch --> CalcCoord["计算电极坐标"]
|
||||
CrossHole --> CalcCoord
|
||||
Custom --> CalcCoord
|
||||
CalcCoord --> CreateFile["创建URF文件"]
|
||||
CreateFile --> WriteHeader["写入URF文件头"]
|
||||
WriteHeader --> WriteElec["写入电极信息"]
|
||||
WriteElec --> WriteData["写入测量数据"]
|
||||
WriteData --> SaveFile["保存URF文件"]
|
||||
SaveFile --> End([URF导出完成])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L31-L800)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L146-L148)
|
||||
|
||||
**Section sources**
|
||||
- [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L31-L800)
|
||||
|
||||
## 批处理脚本集成
|
||||
批处理脚本(如IAP-GD10.bat)与核心功能的集成主要通过命令行调用实现。这些脚本通常用于固件更新或设备配置,通过调用DFU工具来完成设备的编程操作。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant BatchScript as "批处理脚本"
|
||||
participant DFUTool as "DFU工具"
|
||||
participant Device as "GD10设备"
|
||||
User->>BatchScript : 运行IAP-GD10.bat
|
||||
BatchScript->>BatchScript : 延迟10秒等待设备连接
|
||||
BatchScript->>DFUTool : 调用DfuCreateFile创建DFU文件
|
||||
DFUTool-->>BatchScript : 生成APP.dfu文件
|
||||
BatchScript->>DFUTool : 调用DfuSeCommand烧录固件
|
||||
DFUTool->>Device : 通过USB传输固件
|
||||
Device-->>DFUTool : 确认烧录完成
|
||||
DFUTool-->>BatchScript : 返回烧录结果
|
||||
BatchScript->>BatchScript : 删除临时DFU文件
|
||||
BatchScript-->>User : 完成固件更新
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [IAP-GD10.bat](file://tools/IAP-GD10.bat#L1-L16)
|
||||
|
||||
**Section sources**
|
||||
- [IAP-GD10.bat](file://tools/IAP-GD10.bat#L1-L16)
|
||||
|
||||
## 错误处理机制
|
||||
系统实现了全面的错误处理机制,确保在数据导入导出过程中出现问题时能够及时发现并处理。错误处理包括格式验证、编码处理、数据完整性检查等方面。
|
||||
|
||||
### 格式兼容性检查
|
||||
在导入数据时,系统首先检查文件格式是否兼容。对于Access数据库文件,系统会验证是否存在特定的版本标识符,确保文件结构正确。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始导入]) --> CheckFile["检查文件是否存在"]
|
||||
CheckFile --> |不存在| ShowError1["显示文件不存在错误"]
|
||||
CheckFile --> |存在| OpenConnection["打开数据库连接"]
|
||||
OpenConnection --> |失败| ShowError2["显示连接错误"]
|
||||
OpenConnection --> |成功| CheckVersion["检查数据库版本"]
|
||||
CheckVersion --> |版本不匹配| ShowError3["显示版本不兼容错误"]
|
||||
CheckVersion --> |版本匹配| BeginTransaction["开始事务"]
|
||||
BeginTransaction --> ImportData["导入数据"]
|
||||
ImportData --> |成功| Commit["提交事务"]
|
||||
ImportData --> |失败| Rollback["回滚事务"]
|
||||
Commit --> End([导入成功])
|
||||
Rollback --> ShowError4["显示导入失败错误"]
|
||||
ShowError1 --> End
|
||||
ShowError2 --> End
|
||||
ShowError3 --> End
|
||||
ShowError4 --> End
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L133-L158)
|
||||
|
||||
### 编码问题处理
|
||||
系统在处理文本文件时,会自动检测文件编码,并在必要时进行转换。对于中文环境,系统使用适当的字符集确保中文字符的正确显示。
|
||||
|
||||
### 数据丢失预防
|
||||
为防止数据丢失,系统在执行导入导出操作时使用数据库事务。所有操作都在事务中进行,只有当所有操作都成功完成时才会提交事务,否则回滚到操作前的状态。
|
||||
|
||||
**Section sources**
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L177-L188)
|
||||
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L63-L77)
|
||||
|
||||
## 结论
|
||||
Geomative Studio的数据导入导出功能提供了全面的解决方案,支持多种数据格式的转换。系统采用分层架构设计,各组件职责明确,便于维护和扩展。通过IOManager和DataOperator类的协同工作,实现了从数据库到各种文件格式的高效转换。同时,系统提供了完善的错误处理机制,确保数据操作的安全性和可靠性。批处理脚本的集成进一步增强了系统的自动化能力,为用户提供了便捷的操作体验。
|
||||
Reference in New Issue
Block a user