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

6.9 KiB
Raw Blame History

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"
}

写入表头--WriteHeader

请求信息

dll.WriteHeader(handleID, header)

请求参数

参数名 类型 必填 说明
handleID int CSV文件句柄ID
header string 表头JSON数组字符串

header参数示例

["列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 需要释放的字符串