daShangDao_kfzgw-info/md/newcsv.md
2026-01-13 16:21:38 +08:00

307 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | 是 | 需要释放的字符串 |