[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 slimay 于 2021-8-8 15:26 编辑

解法零:WPS函数法 也只用2秒
在明细中构造 列并 G列=A2&":"&E2&":"&F2,  行号 H列 = ROW(A2)下拉扩展所有行
然后使用vlookup直接检索列并 G列的内容  = VLOOKUP("YT5692687908699:无锡中心:下车扫描",  明细!G:H,2,FALSE)
返回的就是行号. 通过构造列并, 将查询耗时缩短到 2秒左右.亲测6万行只需1秒左右
  1. 查询订单号 查询集散地 查询扫描状态
  2. YT5692687908699 无锡中心 下车扫描
  3. 查询结果(列并) 查询到的行号
  4. YT5692687908699:无锡中心:下车扫描 11
复制代码
解法一: C语言 20万行 0.01秒实测
这种问题,不用C,你很难做到毫秒级解决问题
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define LINE_SIZE 1024
  6. char* yundanSN = "YT5692687908699";
  7. char* yundanAddress = "无锡中心";
  8. char* yundanState = "下车扫描";
  9. int main( int argc, char** argv )
  10. {
  11. if(argc != 2)
  12. {
  13. printf("Usage: argv[0] \"*.csv\"\n");
  14. exit(1);
  15. }
  16. FILE* fp = fopen(argv[1], "rb");
  17. if(fp == NULL)
  18. {
  19. printf("%s\n", "Error list file.");
  20. exit(1);
  21. }
  22. char line[LINE_SIZE + 1];
  23. line[0] = 0x00;
  24. int lineNum = 0;
  25. while(! feof(fp))
  26. {
  27. lineNum ++;
  28. fgets(line, LINE_SIZE, fp);
  29. if(strstr(line, yundanSN) && strstr(line, yundanAddress) && strstr(line, yundanState))
  30. {
  31. printf("SN:%s, LINE_SN:%d\n", yundanSN, lineNum);
  32. break;
  33. }
  34. }
  35. fclose(fp);
  36. return 0;
  37. }
复制代码
解法二: 批处理 2万行 10秒实测
批处理搞定
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "查询运单编号=YT5692687908699"
  4. set "查询运单地址=无锡中心"
  5. set "查询运单状态=下车扫描"
  6. set 行号=0
  7. for /f "delims=, tokens=1-3" %%a in ('more +35 "%~f0"') do (
  8. set/a "行号+=1"
  9. if not defined #%%a (
  10. if "%%a"=="%查询运单编号%" (
  11. if "%%b"=="%查询运单地址%" (
  12. if "%%c"=="%查询运单状态%" (
  13. set "#%%a=!行号!"
  14. )
  15. )
  16. )
  17. )
  18. )
  19. echo 运单编号         行号
  20. for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
  21. echo;%%a  %%b
  22. )
  23. pause
  24. REM 数据粘贴区
  25. 运单号,操作时间,操作频次,操作网点编号,操作网点名称,操作名称
  26. YT5692687908699,2,3,4,广东省江门市,业务员收件
  27. YT5692687908699,2,3,4,广东省江门市,揽收扫描
  28. YT5692687908699,,,,广东省江门市,下车扫描
  29. YT5692687908699,,,,广东省江门市,装件入包扫描
  30. YT5692687908699,,,,广东省江门市,装件入车扫描
  31. YT5692687908699,,,,广东省江门市,发车扫描
  32. YT5692687908699,,,,江门中心,到车扫描
  33. YT5692687908699,,,,江门中心,下车扫描
  34. YT5692687908699,,,,江门中心,装件入车扫描
  35. YT5692687908699,,,,无锡中心,下车扫描
  36. YT5692687908699,,,,无锡中心,下车扫描
  37. YT5692687908699,,,,无锡中心,装件入车扫描
  38. YT5692687908699,,,,新区春潮一部,下车扫描
  39. YT5692687908699,,,,经济开发区,下车扫描
  40. YT5692687908699,,,,经济开发区,装件入车扫描
  41. YT5692687908699,,,,无锡中心,下车扫描
  42. YT5692687908699,,,,无锡中心,装件入车扫描
  43. YT5692687908699,,,,新区,下车扫描
  44. YT5692687908699,2,3,4,广东省江门市,业务员收件
  45. YT5692687908699,2,3,4,广东省江门市,揽收扫描
  46. YT5692687908699,,,,广东省江门市,下车扫描
  47. YT5692687908699,,,,广东省江门市,装件入包扫描
  48. YT5692687908699,,,,广东省江门市,装件入车扫描
  49. YT5692687908699,,,,广东省江门市,发车扫描
  50. YT5692687908699,,,,江门中心,到车扫描
  51. YT5692687908699,,,,江门中心,下车扫描
  52. YT5692687908699,,,,江门中心,装件入车扫描
  53. YT5692687908699,,,,无锡中心,下车扫描
  54. YT5692687908699,,,,无锡中心,下车扫描
  55. YT5692687908699,,,,无锡中心,装件入车扫描
  56. YT5692687908699,,,,新区春潮一部,下车扫描
  57. YT5692687908699,,,,经济开发区,下车扫描
  58. YT5692687908699,,,,经济开发区,装件入车扫描
  59. YT5692687908699,,,,无锡中心,下车扫描
  60. YT5692687908699,,,,无锡中心,装件入车扫描
  61. YT5692687908699,,,,新区,下车扫描
  62. YT5692687908699,2,3,4,广东省江门市,业务员收件
  63. YT5692687908699,2,3,4,广东省江门市,揽收扫描
  64. YT5692687908699,,,,广东省江门市,下车扫描
  65. YT5692687908699,,,,广东省江门市,装件入包扫描
  66. YT5692687908699,,,,广东省江门市,装件入车扫描
  67. YT5692687908699,,,,广东省江门市,发车扫描
  68. YT5692687908699,,,,江门中心,到车扫描
  69. YT5692687908699,,,,江门中心,下车扫描
复制代码
1

评分人数

TOP

本帖最后由 slimay 于 2021-8-8 17:05 编辑

回复 11# 朱科技
可以的,用来VB宏,连vlookup都省了, VB直接就能for循环, 不需要vlookup了,但是你的程序要兼容VB宏, 不同电脑对VB宏的兼容性不一样. 我以前写过宏,但是放到别的电脑上运行,出现宏兼容性问题.
就用vlookup吧,添加两列辅助列,  5000行, 20万数据源也是十几秒出结果.
如果用C语言, 多线程, 关键词编码, 实现上亿条数据的查询,也是不超过5秒. 你就是把五大快递公司的数据都弄过来,我用C查也不会超过30秒.十几亿级数据并发高速查询

TOP

本帖最后由 slimay 于 2021-8-8 17:10 编辑

回复 13# 朱科技
我用的100元的CPU,也就1秒出结果了,你把你的函数贴出来, 我看看你怎么写的,不会这么慢的, 肯定是你的表格函数有问题,做了无用的功,导致反应变慢

TOP

回复 15# 朱科技
写的逻辑很糟糕, 问题很大. 怪不得速度慢了

TOP

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

回复 17# 523066680

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

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

TOP

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

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

TOP

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

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

TOP

返回列表