307 lines
6.9 KiB
Markdown
307 lines
6.9 KiB
Markdown
# 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 | 是 | 需要释放的字符串 | |