# csv.dll 使用教程 ## 1.创建DLL工具实例 ### 加载DLL文件 ```gotemplate // CSVDLL CSV文件工具DLL结构 type csvDLL struct { dll *syscall.DLL openCSVFile *syscall.Proc // 打开CSV文件 writeHeader *syscall.Proc // 写入表头 writeRows *syscall.Proc // 写入/覆盖行数据 updateRow *syscall.Proc // 修改指定行数据 getRow *syscall.Proc // 获取指定行数据 closeHandles *syscall.Proc // 关闭指定句柄 closeAllHandles *syscall.Proc // 关闭所有句柄 freeCString *syscall.Proc // 释放C字符串 } // 初始化csvDLL func InitCSVDLL() (*csvDLL, error) { dllPath := filepath.Join("dll", "csv.dll") if _, err := os.Stat(dllPath); os.IsNotExist(err) { return nil, fmt.Errorf("csv DLL 不存在: %s", dllPath) } if dll, err := syscall.LoadDLL(dllPath); err != nil { return nil, fmt.Errorf("加载csv DLL 失败: %s", err) } else { return &csvDLL{ dll: dll, openCSVFile: dll.MustFindProc("OpenCSVFile"), writeHeader: dll.MustFindProc("WriteHeader"), writeRows: dll.MustFindProc("WriteRows"), updateRow: dll.MustFindProc("UpdateRow"), getRow: dll.MustFindProc("GetRow"), closeHandles: dll.MustFindProc("CloseHandles"), closeAllHandles: dll.MustFindProc("CloseAllHandles"), freeCString: dll.MustFindProc("FreeCString"), }, nil } } dll, err := InitCSVDLL() ``` ### 获取C字符串 ```gotemplate // cStr 获取C字符串 func (m *csvDLL) cStr(p uintptr) string { if p == 0 { return "" } b := []byte{} for i := uintptr(0); ; i++ { c := *(*byte)(unsafe.Pointer(p + i)) if c == 0 { break } b = append(b, c) } s := string(b) if m.freeCString != nil { m.freeCString.Call(p) } return s } ``` ## 2. 使用dll函数示例 ```gotemplate // 打开CSV文件 func (m *csvDLL) OpenCSVFile(filename string, delimiter byte, hasHeader bool) (string, error) { proc, err := m.dll.FindProc("OpenCSVFile") if err != nil { return "", fmt.Errorf("找不到函数 OpenCSVFile: %v", err) } filenamePtr, _ := syscall.BytePtrFromString(filename) hasHeaderInt := C.int(0) if hasHeader { hasHeaderInt = 1 } resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(filenamePtr)), uintptr(delimiter), uintptr(hasHeaderInt), ) result := m.cStr(resultPtr) return result, nil } ``` # 接口详情 ## 打开CSV文件--OpenCSVFile ### 请求信息 ```gotemplate dll.OpenCSVFile(filename, delimiter, hasHeader) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|----------------| | filename | string | 是 | 文件名称(带路径) | | delimiter | string | 是 | 分隔符(如 ',') | | hasHeader | string | 是 | 是否有表头(0=是) | ### 响应示例 ```json { "success": true, "data": { "handleID": 123456789 } } ``` ### 错误响应示例 ```json { "success": false, "message": "文件不存在: /path/to/file.csv" } ``` ## 写入表头--WriteHeader ### 请求信息 ```gotemplate dll.WriteHeader(handleID, header) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|--------------| | handleID | int | 是 | CSV文件句柄ID | | header | string | 是 | 表头JSON数组字符串 | ### header参数示例 ```json ["列1", "列2", "列3", "列4"] ``` ### 响应示例 ```json { "success": true } ``` ### 错误响应示例 ```json { "success": false, "message": "header JSON解析失败: invalid character '[' looking for beginning of value" } ``` ## 写入/覆盖行数据--WriteRows ### 请求信息 ```gotemplate dll.WriteRows(handleID, rowsData) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|---------------| | handleID | int | 是 | CSV文件句柄ID | | rowsData | string | 是 | 行数据JSON数组字符串 | ### rowsData参数示例 ```json [ ["数据1-1", "数据1-2", "数据1-3", "数据1-4"], ["数据2-1", "数据2-2", "数据2-3", "数据2-4"], ["数据3-1", "数据3-2", "数据3-3", "数据3-4"] ] ``` ### 响应示例 ```json { "success": true, "data": { "totalRows": 15 } } ``` ### 错误响应示例 ```json { "success": false, "message": "rowsData JSON解析失败: invalid character '[' looking for beginning of value" } ``` ## 修改指定行数据--UpdateRow ### 请求信息 ```gotemplate dll.UpdateRow(handleID, rowNumber, rowData) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|---------------| | handleID | int | 是 | CSV文件句柄ID | | rowNumber | int | 是 | 要修改的行号(从0开始) | | rowData | string | 是 | 新行数据JSON数组字符串 | ### rowsData参数示例 ```json ["新数据1", "新数据2", "新数据3", "新数据4"] ``` ### 响应示例 ```json { "success": true, "message": "成功修改第2行数据" } ``` ### 错误响应示例 ```json { "success": false, "message": "行号超出范围: 10, 总行数: 5" } ``` ## 获取指定行数据--GetRow ### 请求信息 ```gotemplate dll.GetRow(handleID, rowNumber) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|---------------| | handleID | int | 是 | CSV文件句柄ID | | rowNumber | int | 是 | 要获取的行号(从0开始) | ### 响应示例 ```json { "success": true, "data": ["数据1", "数据2", "数据3", "数据4"] } ``` ### 错误响应示例 ```json { "success": false, "message": "行号超出范围: 10, 总行数: 5" } ``` ## 合并两个csv文件--MergeCSVFilesSimple ### 请求信息 ```gotemplate dll.MergeCSVFilesSimple(srcHandleID, dstHandleID, appendMode) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|--------------------------| | srcHandleID | int64 | 是 | 源文件句柄ID | | dstHandleID | int64 | 是 | 目标文件句柄ID(合并后结果) | | appendMode | int | 是 | 0:true=追加模式,1:false=覆盖模式 | ### 响应示例 ### 响应示例 ```json { "success": true, "data": { "totalRows": 15 } } ``` ### 错误响应示例 ```json { "success": false, "message": "rowsData JSON解析失败: invalid character '[' looking for beginning of value" } ``` ## 关闭指定句柄--CloseHandles ### 请求信息 ```gotemplate dll.CloseHandles(handleID) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--|--|---------------| | handleID | int | 是 | CSV文件句柄ID | ### 响应示例 ```text 关闭句柄 123456789 成功! ``` ### 错误响应示例 ```text 句柄不存在: 123456789 ``` ## 关闭所有句柄--CloseAllHandles ### 请求信息 ```gotemplate dll.CloseAllHandles() ``` ### 请求参数 无 ### 响应示例 ```text 关闭句柄成功! ``` ## 释放C字符串内存--FreeCString ### 请求信息 ```gotemplate dll.FreeCString(str) ``` ### 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--|--------|--|-----------| | str | string | 是 | 需要释放的字符串 |