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

7.0 KiB
Raw Blame History

csv.dll 使用教程

1.创建DLL工具实例

加载DLL文件

// CsvDLL CSV文件工具DLL结构
type csvDLL struct {
	dll           *syscall.DLL
	openCSVFile   *syscall.Proc // 打开/创建CSV文件
	readRows      *syscall.Proc // 读取多行数据
	writeRows     *syscall.Proc // 写入/覆盖行数据
	appendRows    *syscall.Proc // 追加行数据
	getRowCount   *syscall.Proc // 获取总行数
	findRows      *syscall.Proc // 搜索行
	closeCSVFile  *syscall.Proc // 关闭CSV文件
	mergeCSVFiles *syscall.Proc // 合并多个CSV文件
	getError      *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"),
			readRows:      dll.MustFindProc("ReadRows"),
			writeRows:     dll.MustFindProc("WriteRows"),
			appendRows:    dll.MustFindProc("AppendRows"),
			getRowCount:   dll.MustFindProc("GetRowCount"),
			findRows:      dll.MustFindProc("FindRows"),
			closeCSVFile:  dll.MustFindProc("CloseCSVFile"),
			mergeCSVFiles: dll.MustFindProc("MergeCSVFiles"),
			getError:      dll.MustFindProc("GetError"),
			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(filePath string, delimiter byte, hasHeader bool) (int64, error) {
	proc, err := m.dll.FindProc("OpenCSVFile")
	if err != nil {
		return -1, fmt.Errorf("找不到函数 OpenCSVFile: %v", err)
	}
	filePathPtr, _ := syscall.BytePtrFromString(filePath)
	hasHeaderInt := 0
	if hasHeader {
		hasHeaderInt = 1
	}
	info, _, _ := proc.Call(
		uintptr(unsafe.Pointer(filePathPtr)),
		uintptr(delimiter),
		uintptr(hasHeaderInt))
	return int64(info), nil
}

接口详情

1.打开/创建CSV文件(句柄)--OpenCSVFile

请求信息

dll.OpenCSVFile(filename,delimiter,hasHeader)

请求参数

参数名 类型 必填 说明
filename string 文件名称(带路径)
delimiter string 分隔符(如 ',')
hasHeader string 是否有标题行

响应示例

句柄int64

2.读取多行数据--ReadRows

请求信息

dll.ReadRows(handle,startRow,count,buffer)

请求参数

参数名 类型 必填 说明
handle int64 文件句柄
startRow int64 起始行
count int64 总数
buffer []byte 返回的文件数据信息byte

响应示例

句柄int64

3.写入/覆盖行数据--WriteRows

请求信息

dll.WriteRows(handle,rowsData,header)

请求参数

参数名 类型 必填 说明
handle int64 文件句柄
rowsData string 写入的数据,[][]string转换成字符串
header int 是否有文件头0:有

响应示例

文件数据行数int64

4.追加行数据--AppendRows

请求信息

dll.AppendRows(handle,rowsData,rowCount)

请求参数

参数名 类型 必填 说明
handle int64 文件句柄
rowsData []byte 写入的数据,将[][]string转换成[]byte
dataSize int 写入数据的大小
rowCount int 数据行数

响应示例

文件是否追加成功int64 0成功

5.获取总行数--GetRowCount

请求信息

dll.GetRowCount(handle)

请求参数

参数名 类型 必填 说明
handle int64 文件句柄

响应示例

文件总行数int64

6.搜索行--FindRows

请求信息

dll.FindRows(handle,searchText,columnIndex,resultBuffer,maxResults)

请求参数

参数名 类型 必填 说明
handle int64 文件句柄
searchText string 要搜索的文本内容
columnIndex int64 指定搜索的列索引,索引从0开始 -1:表示搜索所有列
resultBuffer []byte 结果缓冲区,用于存储找到的行索引
maxResults int64 限制最大返回结果数量

响应示例

实际找到的匹配行数int64

7.合并多个CSV文件(线程安全)--MergeCSVFiles

请求信息

dll.MergeCSVFiles(handlesPtr,handlesCount,outputFilename,delimiter,hasHeader)

请求参数

参数名 类型 必填 说明
handlesPtr []int64 文件句柄数组
handlesCount string 文件句柄数组长度
columnIndex int64 指定搜索的列索引,索引从0开始 -1:表示搜索所有列
resultBuffer []byte 结果缓冲区,用于存储找到的行索引
maxResults int64 限制最大返回结果数量

响应示例

文件句柄int64

8.关闭文件--CloseCSVFile

请求信息

dll.MergeCSVFiles(handle)

请求参数

参数名 类型 必填 说明
handle []int64 文件句柄

响应示例

结果int64 0:表示成功

8.获取错误信息--GetError

请求信息

dll.GetError(buffer)

请求参数

参数名 类型 必填 说明
buffer []byte 结果缓冲区,用于存储找到的行索引

响应示例

结果:int

9.释放C字符串内存--FreeCString

请求信息

dll.FreeCString(str)

请求参数

参数名 类型 必填 说明
str string 需要释放的字符串