CSV 看起来只是逗号分隔文本,真正写到项目里却很容易出错:字段本身可能带逗号、双引号和换行,不同文件的列头、换行符、编码也不一定一致。用 StrSplit() 拆简单数据没问题,遇到正规 CSV 文件就不够用了。
我整理的 ParseCsv 资源面向 AutoHotkey v1,除了把 CSV 解析成可按列名访问的记录对象,还补齐了插入、更新、删除、排序、去重、查找、重新拼接、保存文件和生成测试 CSV 等常用操作。它更适合把 CSV 当成一张小型数据表来处理。
它比简单拆字符串多了什么
- 正确处理带引号字段、字段内逗号和字段内换行;
- 通过表头名称读取字段,不必死记列号;
- 支持 InsertRow、UpdateWhere、DeleteWhere 等行操作;
- 支持 AddColumn、RenameColumn、DeleteColumn 等列操作;
- 支持 Find、FindAll、SortBy、Unique 和 UniqueValues;
- 可用 Join() 输出文本,也可用 Save() 直接保存文件;
- 配套 GenerateCsv,可生成测试数据验证脚本。
解析参数要先确认
RecordDelimiter 是记录分隔符,FieldDelimiter 是字段分隔符,QuoteChar 是引用字符。大多数常规 CSV 使用换行、逗号和双引号,但从旧软件或国外系统导出的文件可能使用分号、Tab 或不同换行格式。解析结果异常时,先检查这三个参数和文件编码。
大文件的耗时还会受到引用字段影响。字段里允许换行时,解析器必须做更多判断;如果上游数据可控,保持规范换行并减少不必要的引用字段,处理速度会更好。
适合哪些场景
它适合批量名单、软件导出报表、日志整理、配置表和临时数据交换。若数据需要复杂关联查询、事务和长期增量维护,SQLite 会更合适;若只是可靠地读取、改几列再导出 CSV,ParseCsv 更直接。
下面的示例先解析带逗号、换行和转义双引号的数据,再演示查找、增删改列、去重、排序、生成 CSV 和保存文件。运行后会在脚本目录生成两个示例 CSV 文件。
打包库和示例的下载地址:
蓝奏云:https://wwbtw.lanzouu.com/i4gYT3wt4gmh 提取码:ahk6
百度网盘:https://pan.baidu.com/s/1FA09xU8jDvz1Ztf4dImpXw?pwd=ahk6 提取码:ahk6
demo代码片段展示:
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
#Include <ParseCsv_v1>
#Include <GenerateCsv_v1>
csvText =
(
Name,Age,Note
Alice,31,"hello, csv"
Bob,28,"line one
line two"
Carol,35,"AHK ""quoted"" value"
)
pcsv := ParseCsv({RecordDelimiter: "`n", FieldDelimiter: ",", QuoteChar: """"}, csvText)
msg := "Rows: " pcsv.Length() "`n"
msg .= "Headers: " pcsv.Headers[1] ", " pcsv.Headers[2] ", " pcsv.Headers[3] "`n"
msg .= "Bob note: " pcsv[2].Note "`n"
foundIndex := pcsv.Find("AHK ""quoted"" value", "Note", 1, "", true, false, foundField, foundHeader, foundRecord)
msg .= "Find result: row " foundIndex ", " foundHeader " = " foundField "`n"
pcsv.Join(joined, "`n", ",", true)
msg .= "`nJoined CSV:`n" joined
MsgBox, 64, ParseCsv v1 Example, %msg%
pcsv.InsertRow({Name: "Dave", Age: 28, Note: "new row"})
pcsv.AddColumn("Status", "Open")
pcsv.UpdateWhere({Name: "Bob"}, {Status: "Done", Note: "updated by UpdateWhere"})
pcsv.RenameColumn("Status", "State")
pcsv.DeleteWhere({Name: "Alice"})
pcsv.InsertRow({Name: "Bob", Age: 28, Note: "duplicate", State: "Done"})
removed := pcsv.Unique(["Name", "Age"])
pcsv.SortBy("Age", true, true)
states := pcsv.UniqueValues("State")
pcsv.DeleteColumn("State")
pcsv.Join(afterCrud, "`n", ",", true)
MsgBox, 64, ParseCsv v1 CRUD Example, % "Removed duplicates: " removed "`nUnique state count before DeleteColumn: " states.Length() "`n`n" afterCrud
outPath := A_ScriptDir "\ParseCsv_v1_generated_sample.csv"
csv := GenerateCsv({Rows: 3, Columns: 3, PathOut: outPath, Overwrite: true, ProbabilityQuotedString: 1, RandomRecordDelimiters: false})
MsgBox, 64, GenerateCsv v1 Example, % "Generated file:`n" outPath "`n`nContent:`n" csv.Content
savePath := A_ScriptDir "\ParseCsv_v1_saved_sample.csv"
pcsv.Save(savePath)
MsgBox, 64, ParseCsv v1 Save Example, % "Saved edited CSV:`n" savePath
ExitApp
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)