ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lhj323323

[已解决] 提速,提取4000多个txt,耗时56.39秒,谢谢prome3、wanghan519、lxdexcel等诸位老师!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-2-14 21:37 | 显示全部楼层
prome3 发表于 2024-2-13 21:58
这个着实很快!刚刚我试了一下,4042 个文件,5.30 GB 总大小,只需要 0.5 秒!而且结果都是正确的。相比 ...

代码的思路我弄清楚了,确实很妙。倒不是说用了Seek,因为一开始我看到这个贴子的时候立马就想到了Seek跳转,只是后来分析源数据的时候发现每条记录的文本长度是不同的,就自作聪明地以为这方法不靠谱。于是采用了更为靠谱、更直观但速度更慢的做法。

这感觉有点像在地上挖宝贝,摸到石头了,却放弃了,其实宝贝就在石头下面。

我不知道在85楼的时候,楼主有没有验证代码的逻辑正确性,有没有用源数据测试过结果的正确性。但在这里,我可以肯定地说,73楼的代码是靠谱的、正确的。

而且,他的代码(或者说思路)更适合解决后来提出的按日期查找的问题。我推荐楼主用他的代码(其他人的代码我都看过了,加上我的,都不如他的代码(思路)好)。

楼主可以试着把他的代码改为按日期查找的,亲身体验一下其中玄妙。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-15 07:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lxdexcel 发表于 2024-2-13 11:06
txt文件与工作表应在同一路径

老师:

nums = 242 * 80
是构思是什么?
搞了几天,都没看懂。

TA的精华主题

TA的得分主题

发表于 2024-2-15 08:01 | 显示全部楼层
lhj323323 发表于 2024-2-15 07:40
老师:

nums = 242 * 80

思路确定很妙,读取的数据比最后一天多一点,再在后面定位

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-15 08:02 | 显示全部楼层
yuwd3 发表于 2024-2-15 08:01
思路确定很妙,读取的数据比最后一天多一点,再在后面定位

为什么是242,而不是240?
另外,那个80是什么意思?

TA的精华主题

TA的得分主题

发表于 2024-2-15 08:21 | 显示全部楼层
如下图中:
第一句计算最后一行的行号,减去匹配行的行号,等于240
第二句计算文件中最长的行有几个字节,等于78
第三句是直接搜
第四句是先截取最后242行再搜

楼上大佬的算法不仅是seek先把光标定位到文件末尾,减少需要处理的内容
而且是整个一个字符串搜,而不是逐行搜,很妙


批注 2024-02-15 081622.jpg

TA的精华主题

TA的得分主题

发表于 2024-2-15 09:11 | 显示全部楼层
lhj323323 发表于 2024-2-15 08:02
为什么是242,而不是240?
另外,那个80是什么意思?

为了提高可靠性,多加了几行搜素范围,80是每行最大字节数,大部分数据在70左右,但成交量及成交金额变大时字节数要变大,但即使上亿不会超过80个字节,使用稍大一些的数,对速度不会有大的影响,比如 300 100

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-15 10:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lxdexcel 发表于 2024-2-15 09:11
为了提高可靠性,多加了几行搜素范围,80是每行最大字节数,大部分数据在70左右,但成交量及成交金额变大 ...

一天,是240行
加最后一条【数据来源:通达信】,也即是241
但为何是242*80?
而不是241*80

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-15 10:15 | 显示全部楼层
lxdexcel 发表于 2024-2-15 09:11
为了提高可靠性,多加了几行搜素范围,80是每行最大字节数,大部分数据在70左右,但成交量及成交金额变大 ...

按上述,我的理解,
如果改为提取2月7日(不是8日)的第一分钟的数据,
那么
nums = 242 * 80
就改为
nums =((240*2)+2) * 80

但在运行时,就会提示【溢出】,是不是上句改错了?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-15 10:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wanghan519 发表于 2024-2-15 08:21
如下图中:
第一句计算最后一行的行号,减去匹配行的行号,等于240
第二句计算文件中最长的行有几个字节 ...

就是没搞明白,为何不是241,而是242

TA的精华主题

TA的得分主题

发表于 2024-2-15 14:05 | 显示全部楼层
lhj323323 发表于 2024-2-15 10:16
就是没搞明白,为何不是241,而是242

你还没搞明白程序的思路,在EXCEL中显示一个str值,再看看就会明白。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 21:53 , Processed in 0.041549 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表