[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 15# 朱科技
写的逻辑很糟糕, 问题很大. 怪不得速度慢了

TOP

本帖最后由 523066680 于 2021-8-8 22:20 编辑

如果表1要处理的项目有10W条,明细(走件流程)的数据有60W条。按先查找单号,后判断操作网点名称,最后判断操作名称,那确实要些时间的,10W*60W*三个判断(大致的,不精确)。

VBA不熟,不够思路大概这样:
创建字典,先筛选 网点名称 和 操作状态 符合的所有单号+行号存储到字典,
然后遍历表1,获取匹配单号的行号填入。

但如果表1待查的每一项,网点名称 和 操作状态 的值不一定一致,每次都需要做判断,用支持哈希表的语言处理好用一些,
我大概会这么创建:$hash{操作名称}{网点名称}{单号} = 行号
(内存占用还未测试)

另外就是数据的读写,最好是整块读出和写入,逐行处理时调用接口的消耗会被10W倍放大

TOP

相当于 比对数据 A 和 数据 B, 为其中一者建字典, 优先选两者中规模小的, 因为 建字典过程 耗时也正相关于 数据规模;

而后的 比对过程  比对量 = 数据A 规模 * 数据 B 规模, 基本固定

TOP

本帖最后由 slimay 于 2021-8-8 21:06 编辑

回复 17# 523066680

可以先对表格筛选啊, 先筛选出 包含 "下车扫描" 的表1,  然后 在这个新表中筛选出 包含 "无锡中心"  的 表2,  然后表2就是很小的范围 , 在匹配单号时(先用表格的排序功能排好序), 单号后几位都是纯数字,  可以二分折半查询, 这样他就是有60万行数据 也只需  循环 几万次就搞定了.即使用C语言, 按这个思路,也是控制在一秒内搞定.
他的描述就是 : 只要无锡中心 下车扫描的 运单号的行数,  他估计就在无锡工作, 既然只关心这一点的下车扫描 件, 那这种方法是最快, 且最能解决问题的.

不过,你的思路具有一般普适性, 适用于各种情况下的,匹配..但是那个计算量和内存确实很难优化.

TOP

本帖最后由 523066680 于 2021-8-8 21:08 编辑

回复 19# slimay

    我猜他后面的需求会扩充,不会只是 无锡中心。所以该建立的表还是要建。
二分没有去试,10W查询*60W条明细,三层哈希查表,调Win32::OLE接口,脚本耗时60秒。

TOP

本帖最后由 slimay 于 2021-8-8 21:30 编辑

回复 20# 523066680
是的,这个只要语言支持哈希, 那直接打表最省心. 貌似也没法用字典树, 这个比较的单号太长, 字典树也会爆了.
换我就直接导入mysql, 然后写个查询语句,也不用编程.这种关系到数据准确性的问题, 最好还是直接上sql.前端写个网页, 能登陆动态查询数据库,一般企业都这么搞

TOP

本帖最后由 523066680 于 2021-8-8 22:19 编辑

回复 21# slimay


使用数据库比如sql server或者my sql
至少得用access
zq1210 发表于 2021-8-7 21:52


    我看到 ExcelHome 有个人说要用 Access 的时候想不至于吧,实操一顿发现:哦豁。

TOP

分享一下补充了60W虚构数据的表格:
https://pan.baidu.com/s/1Yyhyl5TazZ2eKi3mfeYTJQ
提取码:23s7

TOP

本帖最后由 slimay 于 2021-8-8 22:27 编辑

回复 22# 523066680
http://www.code-by.org/怎么变成后花园征婚网站了
你的百度头像nice

TOP

本帖最后由 523066680 于 2021-8-8 23:51 编辑

回复 24# slimay

   哇靠这么快被人抢注了。
这两年忙工作,先把内容备份了,如果有时间再重建恢复资料吧,换个域名。
以前百度博客还活着的时候,设置的头像,其实百度博客当时就是最好用的,但是不知道策划吃了什么浆糊,改到后面四不像,没人用了

TOP

好多人就是要把数据库的活 硬塞在表格里折腾,折腾得不爽了,被建议塞回数据库

TOP

返回列表