Y++ 表格:百万到亿级文本,秒级虚表导入,点选编辑也不卡
表格组件支持大文件虚表导入:百万 / 千万 / 亿级行仍可滚动、点选、双击编辑;小数据同样顺畅。
约 1680 字 · 5 分钟阅读
- 小表:和平时一样用
- 大表:走虚表导入,不把整表塞进内存单元格
- 目标:百万、千万、亿级文本都能打开、滚动、点选、双击编辑
这是什么能力
用表格的 导入文件(按分隔符拆列),把超大 txt 映射成虚表:
- 磁盘文件按需映射,不整表拷进脚本数组
- 行数据按需解码,看得见的行才解析
- 导入后可滚动、读首末行、点选行、双击编辑
适合日志、导出流水、对账明细这类「行很多、列不多」的文本。
实测规模(同机、同格式)
测试格式大致是:序号----倒序----取模
| 规模 | 大约体积 | 体验目标 |
|------|----------|----------|
| 100 万行 | ~26MB | 导入快,界面跟得上 |
| 1000 万行 | ~280MB | 可导入、可滚、点选不假死 |
| 1 亿行 | ~3GB | 可导入、可滚;机器内存建议 ≥16GB |
具体耗时看磁盘和内存;亿级第一次建索引会扫一遍文件,属正常。
怎么自己试
- 打开示例工程
table_import_1m(或自建窗口放一个表格) - 生成测试文件(PowerShell):
- 运行后点「导百万 / 导千万 / 导亿级」,或自己选 txt
- 再试:滚到底、读末行、快速切换选中行、双击编辑
核心代码就一行量级:
表格1.导入文件(路径, "----")
Y++完整代码:
文本 g_默认目录 = "data"
函数 更新状态 (文本 s) {
标签状态.标题 = s
输出(s)
}
函数 准备列 () {
表格1.置列数(3)
表格1.置表头(0, "列A")
表格1.置表头(1, "列B")
表格1.置表头(2, "列C")
}
函数 导入路径 (文本 路径) {
如果 (文本是否为空(路径) 或 文件存在(路径) == 假) {
更新状态("未选择文件或文件不存在:" + 路径)
返回()
}
准备列()
表格1.置行数(0)
更新状态("导入中… " + 路径)
整数 t0 = 取时间戳(, 真)
表格1.导入文件(路径, "----")
整数 总ms = 取时间戳(, 真) - t0
整数 表行 = 表格1.取行数()
文本 首 = 表格1.取单元格(0, 0) + "----" + 表格1.取单元格(0, 1) + "----" + 表格1.取单元格(0, 2)
整数 last = 表行 - 1
文本 尾 = ""
如果 (last >= 0) {
尾 = 表格1.取单元格(last, 0) + "----" + 表格1.取单元格(last, 1) + "----" + 表格1.取单元格(last, 2)
}
更新状态("完成 行=" + 到文本(表行) + " 合计=" + 到文本(总ms) + "ms 首=[" + 首 + "] 末=[" + 尾 + "]")
}
函数 主窗口.创建完毕 () {
准备列()
更新状态("就绪:导百万/千万/亿级,或「选择文件」。先跑 _gen_rows.ps1 生成 data\\*.txt")
}
函数 按钮选择导入.单击 () {
文本 路径 = 打开文件对话框("选择大文件文本", g_默认目录, "文本 (*.txt)|*.txt|所有文件 (*.*)|*.*")
如果 (文本是否为空(路径)) {
更新状态("已取消")
返回()
}
导入路径(路径)
}
函数 按钮导百万.单击 () {
导入路径("data\\rows_100w.txt")
}
函数 按钮导千万.单击 () {
导入路径("data\\rows_1000w.txt")
}
函数 按钮导亿级.单击 () {
导入路径("data\\rows_1yi.txt")
}
函数 按钮滚到底.单击 () {
整数 last = 表格1.取行数() - 1
如果 (last < 0) {
更新状态("请先导入")
返回()
}
整数 t0 = 取时间戳(, 真)
表格1.滚动到单元格(last, 0)
整数 ms = 取时间戳(, 真) - t0
更新状态("滚到底 行=" + 到文本(last) + " " + 到文本(ms) + "ms")
}
函数 按钮读末行.单击 () {
整数 last = 表格1.取行数() - 1
如果 (last < 0) {
更新状态("请先导入")
返回()
}
文本 a = 表格1.取单元格(last, 0)
文本 b = 表格1.取单元格(last, 1)
文本 c = 表格1.取单元格(last, 2)
更新状态("末行 " + 到文本(last) + " = " + a + "----" + b + "----" + c)
}
函数 按钮清空.单击 () {
表格1.置行数(0)
更新状态("已清空 取行数=" + 到文本(表格1.取行数()))
}

还没有回复,来抢沙发吧。