csv.dll 使用教程
1.创建DLL工具实例
加载DLL文件
// 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字符串
// 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函数示例
// 打开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
请求信息
dll.OpenCSVFile(filename, delimiter, hasHeader)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| filename |
string |
是 |
文件名称(带路径) |
| delimiter |
string |
是 |
分隔符(如 ',') |
| hasHeader |
string |
是 |
是否有表头(0=是) |
响应示例
{
"success": true,
"data": {
"handleID": 123456789
}
}
错误响应示例
{
"success": false,
"message": "文件不存在: /path/to/file.csv"
}
请求信息
dll.WriteHeader(handleID, header)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| handleID |
int |
是 |
CSV文件句柄ID |
| header |
string |
是 |
表头JSON数组字符串 |
["列1", "列2", "列3", "列4"]
响应示例
{
"success": true
}
错误响应示例
{
"success": false,
"message": "header JSON解析失败: invalid character '[' looking for beginning of value"
}
写入/覆盖行数据--WriteRows
请求信息
dll.WriteRows(handleID, rowsData)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| handleID |
int |
是 |
CSV文件句柄ID |
| rowsData |
string |
是 |
行数据JSON数组字符串 |
rowsData参数示例
[
["数据1-1", "数据1-2", "数据1-3", "数据1-4"],
["数据2-1", "数据2-2", "数据2-3", "数据2-4"],
["数据3-1", "数据3-2", "数据3-3", "数据3-4"]
]
响应示例
{
"success": true,
"data": {
"totalRows": 15
}
}
错误响应示例
{
"success": false,
"message": "rowsData JSON解析失败: invalid character '[' looking for beginning of value"
}
修改指定行数据--UpdateRow
请求信息
dll.UpdateRow(handleID, rowNumber, rowData)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| handleID |
int |
是 |
CSV文件句柄ID |
| rowNumber |
int |
是 |
要修改的行号(从0开始) |
| rowData |
string |
是 |
新行数据JSON数组字符串 |
rowsData参数示例
["新数据1", "新数据2", "新数据3", "新数据4"]
响应示例
{
"success": true,
"message": "成功修改第2行数据"
}
错误响应示例
{
"success": false,
"message": "行号超出范围: 10, 总行数: 5"
}
获取指定行数据--GetRow
请求信息
dll.GetRow(handleID, rowNumber)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| handleID |
int |
是 |
CSV文件句柄ID |
| rowNumber |
int |
是 |
要获取的行号(从0开始) |
响应示例
{
"success": true,
"data": ["数据1", "数据2", "数据3", "数据4"]
}
错误响应示例
{
"success": false,
"message": "行号超出范围: 10, 总行数: 5"
}
合并两个csv文件--MergeCSVFilesSimple
请求信息
dll.MergeCSVFilesSimple(srcHandleID, dstHandleID, appendMode)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| srcHandleID |
int64 |
是 |
源文件句柄ID |
| dstHandleID |
int64 |
是 |
目标文件句柄ID(合并后结果) |
| appendMode |
int |
是 |
0:true=追加模式,1:false=覆盖模式 |
响应示例
响应示例
{
"success": true,
"data": {
"totalRows": 15
}
}
错误响应示例
{
"success": false,
"message": "rowsData JSON解析失败: invalid character '[' looking for beginning of value"
}
关闭指定句柄--CloseHandles
请求信息
dll.CloseHandles(handleID)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| handleID |
int |
是 |
CSV文件句柄ID |
响应示例
关闭句柄 123456789 成功!
错误响应示例
句柄不存在: 123456789
关闭所有句柄--CloseAllHandles
请求信息
dll.CloseAllHandles()
请求参数
无
响应示例
关闭句柄成功!
释放C字符串内存--FreeCString
请求信息
dll.FreeCString(str)
请求参数
| 参数名 |
类型 |
必填 |
说明 |
| str |
string |
是 |
需要释放的字符串 |