Y++ 社区

Y++ 表格:百万到亿级文本,秒级虚表导入,点选编辑也不卡

源码 组件示例 置顶 精选 浏览 3 管理员

Y++表格组件大数据虚表导入百万千万亿级

表格组件支持大文件虚表导入:百万 / 千万 / 亿级行仍可滚动、点选、双击编辑;小数据同样顺畅。

登录后收藏

约 1680 字 · 5 分钟阅读

  • 小表:和平时一样用
  • 大表:走虚表导入,不把整表塞进内存单元格
  • 目标:百万、千万、亿级文本都能打开、滚动、点选、双击编辑

这是什么能力

用表格的 导入文件(按分隔符拆列),把超大 txt 映射成虚表:

  • 磁盘文件按需映射,不整表拷进脚本数组
  • 行数据按需解码,看得见的行才解析
  • 导入后可滚动、读首末行、点选行、双击编辑

适合日志、导出流水、对账明细这类「行很多、列不多」的文本。

实测规模(同机、同格式)

测试格式大致是:
序号----倒序----取模
| 规模 | 大约体积 | 体验目标 |
|------|----------|----------|
| 100 万行 | ~26MB | 导入快,界面跟得上 |
| 1000 万行 | ~280MB | 可导入、可滚、点选不假死 |
| 1 亿行 | ~3GB | 可导入、可滚;机器内存建议 ≥16GB |

具体耗时看磁盘和内存;亿级第一次建索引会扫一遍文件,属正常。

怎么自己试

  1. 打开示例工程 table_import_1m(或自建窗口放一个表格)
  2. 生成测试文件(PowerShell):
  1. 运行后点「导百万 / 导千万 / 导亿级」,或自己选 txt
  2. 再试:滚到底、读末行、快速切换选中行、双击编辑

核心代码就一行量级:

表格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.取行数()))
}

 

相关官方文档

回复 (0)

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