[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
收下来,活活。晚安呀,兄弟

TOP

  在DOS联盟里也看到了你的求助帖,在那个帖子里,你最开始还想求出每个操作员的操作次数。其实,用批处理是完全可以办到的。

  从你在顶楼发的数据来看,我并没有找到操作员的信息,姑且把客户帐号当作你想要的操作员吧,现在,我把你的环境做如下假设(若与你的情况不符,请跟帖提出):
  在某个文件夹下(假设是test),只存在从20070101到20071231为名的文件夹,而每个文件夹下,都存在一个1357.txt文件,这个文件存放的是你即将要统计的数据,金额一栏小数点后的两位数字都是0,现在要统计每个操作员的操作次数(在你的数据中,实际上对应的是客户帐号)及总共的金额,那么,可把如下代码放到test目录下运行即可。

  以下代码的总体思路是:先在当前目录及其所有子目录中搜索1357.txt,然后,把所有1357.txt的内容都去掉头5行之后,合并到test.txt中,再对test.txt的内容进行排序,通过比较上下行第一列内容的不同求出客户帐号出现的次数(也就是操作员操作的次数),从而避免了设置大量变量的情况,和DOS联盟3742668的代码比起来,这个方案能够避免产生大量的临时文件:
  1. @echo off
  2. :: 凌晨时发的代码有错误,请用本次代码测试[2008-1-29 17:59]
  3. cd.>test.txt
  4. set /a total=0,times=1
  5. for /f "delims=" %%i in ('dir /a-d /b /s 1357.txt') do (
  6.     >>test.txt more +5 "%%i"
  7. )
  8. setlocal enabledelayedexpansion
  9. for /f "tokens=1,4,5 delims=,. " %%i in ('sort test.txt') do (
  10.     if defined ID (
  11.         if "!ID!"=="%%i" (
  12.             set /a times+=1
  13.         ) else (
  14.             echo !ID! 出现的次数是 !times!
  15.             set times=1
  16.         )
  17.     )
  18.     set /a total+=%%j%%k
  19.     set ID=%%i
  20. )
  21. echo %ID% 出现的次数是 %times%
  22. echo 总金额是 %total%.00
  23. pause
复制代码
  如果只需要统计总金额,那就太容易了:
  1. @echo off
  2. for /f "delims=" %%i in ('dir /a-d /b /s 1357.txt') do (
  3.     for /f "usebackq skip=5 tokens=4,5 delims=,. " %%j in ("%%i") do (
  4.         set /a total+=%%j%%k
  5.     )
  6. )
  7. echo 总金额是 %total%.00
  8. pause
复制代码
  另:你在顶楼发了两个数据附件,但是内容都是一样的,我猜想你是想另传一个不带小数点的数据文件,但是选重了。我删除了其中一个,请把不带小数点的数据文件也发出来,让我们看一下格式吧。

TOP

凌晨时发的第一个代码有错误,请用本次代码测试[2008-1-29 17:59]

TOP

原帖由 foxJL 于 2008-1-28 23:26 发表
根据你给我的数据,增加了一点.@echo off&setlocal enabledelayedexpansion
set lx=6210,6221,6222
set "6210=认购" && set "6221=申购" && set "6222=赎回"
for %%a in (%lx%) do (
set nums=0
for /f %%i in ( ...

活活,老乡,谢谢啦

TOP

  楼主给我传了原始数据,并附上了处理要求,本来想通过QQ联系楼主,再进一步确认一些细节,可惜把附件里提到的QQ加上之后,那个QQ的主人说:楼主留的QQ不是楼主的=_=!现把我的代码发出来,楼主看看是否达到你的要求;若需要修改,请跟帖提出;如有必要,请站内短信联系。

  以下代码必须放在 E:\nstpp\rbs 下执行,若盘符有变,不影响结果;若路径的层深有变,则需要修改部分代码:
  1. @echo off
  2. :: 1、搜索所有的数据文件
  3. :: 2、提取所有数据文件中第5行后所有的第一列数据,
  4. :: 3、重组为 "第一列数据 纯数字型文件夹名 纯数字型文件名"的格式(关键)
  5. :: 4、把重组后的数据按照月份写入"根目录\tmp\××\tmp1.txt"文件中
  6. :: 5、把tmp1.txt中的所有帐号内容提取到tmp2.txt中
  7. :: 6、对tmp2.txt中的数据进行统计,按照
  8. :: "帐户号      月份 总数" 或者
  9. :: "帐户号 月份数 类型号 小计数" 的格式导入"根目录\tmp\tmp_月份号.txt"中
  10. :: 7、按格式提取统计信息
  11. :: 关键处有两点:1、重新组合相关数据并分类写入相关文件;2、各种相似数据的累加
  12. rem ==========初始化各种设置=============
  13. set begin=%time%
  14. set root=%cd:~0,2%
  15. set FileNum=0
  16. :: 统计脚本所在目录存在的文件数量,为后面的 skip=%FileNum% 提供数据
  17. for /f %%i in ('dir /a-d') do set /a FileNum+=1
  18. echo.&echo     本程序将创建临时文件夹 %root%\tmp ,里面存放的是程序运行期间产
  19. echo   生的各种临时数据。为便于跟踪测试,本程序保留所有的临时文件,这
  20. echo   些文件可在程序运行完毕后全部删除。无论删除与否,都不会影响程序
  21. echo   下一次运行的结果。
  22. echo.&echo     正在处理数据。视待处理数据量的大小,这个过程将持续数分钟到
  23. echo   数十分钟不等,请耐心等待...
  24. rem ==========生成各种临时文件=============
  25. :: 提取原始文件中的相关信息,重新组合,写入临时文件,以备最后的统计
  26. rd /q /s %root%\tmp 2>nul
  27. setlocal enabledelayedexpansion
  28. :: 把每个月的相关的临时数据写入以月份命名的临时文件夹下
  29. :: 要做的一些事情:过滤每个文件的头5行(skip=5)、重新组合相关数据(关键处之一)
  30. :: 生成每个月的第一个临时文件
  31. for /f "skip=%FileNum% tokens=1-6 delims=\" %%i in ('dir /a-d /b /s') do (
  32.     title 正在提取 %%i\%%j\%%k\%%l\%%m\%%n 中数据
  33.     set month=%%l
  34.     set month=!month:~7,2!
  35.     md %root%\tmp\!month! 2>nul
  36.     if not exist %root%\tmp\!month!\tmp1.txt (
  37.         echo ;本文件为临时中转文件,在 %%i\%%j\%%k 下!month!月份数据的基础上产生
  38.         echo ;处理结果请看 %root%\tmp\%%i\tmp2.txt
  39.         echo ;以下数据的含义为:交易帐号 纯数字文件夹名 纯数字文件名
  40.         echo ;因为原文件数据格式不尽一致的原因,某些行的数据含义与上述描述不尽相符
  41.         echo ;
  42.     )>%root%\tmp\!month!\tmp1.txt
  43.     for /f "skip=5" %%x in (%%i\%%j\%%k\%%l\%%m\%%n) do (
  44.         echo %%x %%m %%n>>%root%\tmp\!month!\tmp1.txt
  45.     )
  46. )
  47. cd.>result.txt
  48. :: 生成每个月的第二个临时文件
  49. for /f %%i in ('dir /ad /b %root%\tmp') do (
  50.     if not exist %root%\tmp\%%i\tmp2.txt (
  51.         echo ;本文件为临时中转文件,在 %root%\tmp\%%i\tmp1.txt 的基础上产生
  52.         echo ;为后续处理做准备,处理结果请看 %root%\tmp\tmp_%%i.txt
  53.         echo ;以下数据的含义为:交易帐号 纯数字文件夹名 纯数字文件名
  54.         echo ;
  55.     )>%root%\tmp\%%i\tmp2.txt
  56.     findstr /b "[0-9]" %root%\tmp\%%i\tmp1.txt>>%root%\tmp\%%i\tmp2.txt
  57.     for /f "delims==" %%j in ('set num_ 2^>nul') do set %%j=
  58.     for /f "tokens=1-3" %%j in (%root%\tmp\%%i\tmp2.txt) do (
  59.         title 正在统计%%i月份数据
  60.         set /a num_%%k+=1&set /a num_%%k_%%l+=1
  61.     )
  62.     (
  63.         echo ;本文件为临时中转文件,在所有子目录下的tmp2.txt基础上产生
  64.         echo ;处理结果请看 %cd%\result.txt
  65.         echo ;以下数据的含义为:纯数字文件夹名 月份 总数 或者 纯数字文件夹名 月份 纯数字文件名 小计
  66.         echo ;
  67.     )>%root%\tmp\tmp_%%i.txt
  68.     for /f "tokens=2,3,4 delims=_=" %%j in ('set num_') do (
  69.         if "%%l"=="" (
  70.             >>%root%\tmp\tmp_%%i.txt echo %%j %%i      %%k
  71.         ) else (
  72.             >>%root%\tmp\tmp_%%i.txt echo %%j %%i %%k %%l
  73.         )
  74.     )
  75.     for /f "tokens=1-4" %%j in ('sort %root%\tmp\tmp_%%i.txt') do (
  76.         if "%%m"=="" (
  77.             (echo.&echo %%j %%k月份新开户数 %%l,其中:)>>result.txt
  78.         ) else (
  79.             >>result.txt echo     %%l 为 %%m
  80.         )
  81.     )
  82. )
  83. (echo.&echo 程序开始运行时间 %begin%,结束运行时间 %time%)>>result.txt
  84. start result.txt
复制代码
  应楼主的要求,为保密起见,不提供原始数据,请原谅。

TOP

  楼主的要求经常变换,一些代码已经不再适合楼主,暂时不作关注。

TOP

非常抱歉啊
要求更改了几次
谢谢论坛朋友。活活

TOP

返回列表