无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 27025|回复: 28
打印 上一主题 下一主题

请批处理高手帮我做一个文本中关于内容统计的批,谢!

[复制链接]
跳转到指定楼层
1#
发表于 2006-11-23 22:25:55 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
是这样的,我有一个记录文档,比如名称为 SearchNet.txt,里面内容如下:

  1. 5
  2. 7
  3. 15
  4. 18
  5. 29
  6. 34
  7. 45
  8. 50
  9. 53
  10. 55
  11. 57
  12. 61
  13. 64
  14. 70
  15. 71
  16. 75
  17. 81
  18. 86
  19. 87
  20. 89
  21. 98
  22. 99
  23. 103
  24. 106
  25. 111
  26. 118
  27. 124
  28. 125
  29. 126
  30. 128
  31. 135
  32. 138
  33. 146
  34. 155
  35. 156
  36. 157
  37. 160
  38. 170
  39. 173
  40. 176
  41. 178
  42. 180
  43. 185
  44. 191
  45. 203
  46. 204
  47. 208
  48. 212
  49. 215
  50. 231
  51. 238
  52. 240
  53. 246
  54. 247
  55. 250
  56. 253
  57. 255
  58. 2
  59. 7
  60. 9
  61. 12
  62. 15
  63. 19
  64. 30
  65. 38
  66. 53
  67. 55
  68. 59
  69. 61
  70. 68
  71. 70
  72. 71
  73. 75
  74. 81
  75. 86
  76. 87
  77. 88
  78. 89
  79. 98
  80. 99
  81. 103
  82. 106
  83. 111
  84. 115
  85. 116
  86. 118
  87. 122
  88. 125
  89. 126
  90. 130
  91. 135
  92. 138
  93. 142
  94. 143
  95. 146
  96. 147
  97. 150
  98. 151
  99. 152
  100. 156
  101. 159
  102. 163
  103. 170
  104. 173
  105. 175
  106. 177
  107. 178
  108. 180
  109. 182
  110. 185
  111. 203
  112. 204
  113. 207
  114. 217
  115. 233
  116. 240
  117. 245
  118. 246
  119. 247
  120. 250
  121. 253
  122. 254
  123. 255
  124. 7
  125. 18
  126. 19
  127. 30
  128. 38
  129. 53
  130. 61
  131. 64
  132. 66
  133. 70
  134. 71
  135. 75
  136. 88
  137. 89
  138. 95
  139. 98
  140. 99
  141. 103
  142. 104
  143. 106
  144. 109
  145. 111
  146. 114
  147. 116
  148. 118
  149. 122
  150. 125
  151. 126
  152. 130
  153. 134
  154. 138
  155. 140
  156. 143
  157. 151
  158. 155
  159. 156
  160. 157
  161. 159
  162. 163
  163. 166
  164. 176
  165. 177
  166. 180
  167. 182
  168. 183
  169. 185
  170. 189
  171. 203
  172. 204
  173. 207
  174. 212
  175. 217
  176. 227
  177. 233
  178. 234
  179. 238
  180. 240
  181. 241
  182. 242
  183. 247
  184. 250
  185. 255
  186. 5
  187. 8
  188. 9
  189. 11
  190. 12
  191. 15
  192. 17
  193. 30
  194. 36
  195. 41
  196. 42
  197. 45
  198. 48
  199. 49
  200. 53
  201. 57
  202. 59
  203. 63
  204. 64
  205. 66
  206. 67
  207. 68
  208. 70
  209. 73
  210. 76
  211. 77
  212. 79
  213. 82
  214. 86
  215. 88
  216. 89
  217. 90
  218. 95
  219. 98
  220. 99
  221. 101
  222. 102
  223. 103
  224. 105
  225. 109
  226. 110
  227. 111
  228. 113
  229. 115
  230. 116
  231. 118
  232. 124
  233. 125
  234. 126
  235. 127
  236. 129
  237. 130
  238. 134
  239. 138
  240. 140
  241. 143
  242. 144
  243. 147
  244. 151
  245. 155
  246. 157
  247. 161
  248. 162
  249. 163
  250. 167
  251. 7
  252. 9
  253. 10
  254. 11
  255. 5
  256. 9
  257. 18
  258. 19
  259. 20
  260. 22
  261. 31
  262. 59
  263. 61
  264. 70
  265. 76
  266. 77
  267. 81
  268. 86
  269. 88
  270. 89
  271. 90
  272. 99
  273. 105
  274. 106
  275. 109
  276. 111
  277. 2
  278. 4
  279. 5
  280. 7
  281. 10
  282. 15
  283. 18
  284. 19
  285. 22
  286. 29
  287. 31
  288. 33
  289. 36
  290. 38
  291. 41
  292. 46
  293. 49
  294. 57
  295. 59
  296. 61
  297. 66
  298. 70
  299. 72
  300. 73
  301. 75
  302. 76
  303. 4
  304. 5
  305. 11
  306. 15
  307. 19
  308. 20
  309. 30
  310. 33
  311. 36
  312. 42
  313. 45
  314. 46
  315. 47
  316. 4
  317. 5
  318. 11
  319. 19
  320. 22
  321. 23
  322. 29
  323. 31
  324. 46
  325. 47
  326. 50
  327. 57
  328. 61
  329. 68
  330. 70
  331. 71
  332. 73
  333. 75
  334. 76
  335. 86
  336. 88
  337. 89
  338. 90
  339. 99
  340. 101
  341. 102
  342. 103
  343. 104
  344. 105
  345. 106
  346. 109
  347. 110
  348. 111
  349. 114
  350. 115
  351. 124
  352. 125
  353. 126
  354. 130
  355. 131
  356. 133
  357. 134
  358. 137
  359. 138
  360. 140
  361. 142
  362. 144
  363. 147
  364. 157
  365. 159
  366. 160
  367. 165
  368. 166
  369. 167
  370. 169
  371. 173
  372. 177
  373. 180
  374. 183
  375. 185
  376. 186
  377. 187
  378. 192
  379. 203
  380. 207
  381. 208
  382. 209
  383. 212
  384. 213
  385. 214
  386. 221
  387. 229
  388. 233
  389. 237
  390. 238
  391. 240
  392. 246
  393. 255
  394. 3
  395. 5
  396. 11
  397. 17
  398. 18
  399. 19
  400. 22
  401. 23
  402. 29
  403. 33
  404. 34
复制代码

里面的全是数字,最小值为 1,最大值为 255,我现在要做一个批处理,使我能够分析这个 SearchNet.TXT 中从 1 到 255 的每一个数字出现的次数,出现次数为 0 的,当然不要统计啦。要求得到的统计文档格式如下:

Counter.txt
  1. 2 2
  2. 3 1
  3. 4 3
  4. 5 7
  5. 7 5
  6. 8 1
  7. 9 4
  8. 10 2
  9. 11 5
  10. ...
复制代码
为此,我自己也写了个批处理,但是个人感觉执行效率不够高,才 400 多个数据,分析一下居然消耗了整整 100 秒时间(我的机器为 PIII 800MHz + 256MB PC133 SDRAM),请高手帮我优化一下,谢谢!

Counter.CMD
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set tmpfile=search.tmp
  4. set resultfile=counter.txt
  5. if exist %tmpfile% del %tmpfile% /q
  6. if exist %resultfile% del %resultfile% /q
  7. for /f %%i in ('type SearchNET.TXT') do echo a%%ia>>%tmpfile%
  8. for /l %%i in (1,1,255) do (
  9. for /f "tokens=2* delims=::" %%I in ('find /c ^"a%%ia^" %tmpfile%^|find /v ^": 0^"') do (
  10. set /p="%%i%%I">>%resultfile%<nul
  11. echo.>>%resultfile%
  12. )
  13. )
  14. REM del %tmpfile%
  15. ENDLOCAL
复制代码
2#
 楼主| 发表于 2006-11-24 09:43:50 | 显示全部楼层
呵呵,感谢感谢,测试了一下,我办公室电脑为 CD2.8GHz+512MB DDRII,我的代码耗时 24 秒,3F 的代码耗时不到 1  秒,4F 的耗时 14  秒。都比我的快得多。

因为原先不知道 findstr 中还有“$”这么个好咚咚,导致了先在原先的 SearchNet.txt 的每一行家上前后缀,耗去了部分时间,在 Count 的时候又不得不去掉它,效率大大降低了。

但如果我现在想按照里面每个数字出现的频率从高到低排序,又该怎样呢?嘿嘿,又给 Namejm 带来难题了。。。。
回复

使用道具 举报

3#
 楼主| 发表于 2006-11-25 08:38:23 | 显示全部楼层
原帖由 namejm 于 2006-11-24 20:47 发表
  如果要按照每个数字出现的频率从高到低排序,则可在3F的基础上得到如下代码。这个代码会产生大量的临时文件,并且效率比较低下。请测试:

@echo off
set num=-1
sort<SearchNet.TXT>tmp1.txt
cd. ...

嘿嘿,高!不佩服不行了,好好学习一下。。。
回复

使用道具 举报

4#
 楼主| 发表于 2006-11-25 13:23:20 | 显示全部楼层
原帖由 namejm 于 2006-11-25 12:34 发表
  对6F的代码做了一处改动,效率大为提高,请做对比测试:

@echo off
set num=-1
sort<SearchNet.TXT>tmp1.txt
cd.>tmp2.txt
cd.>tmp3.txt
cd.>result.txt
setlocal enabledelayedexpa ...

呵呵,厉害厉害啊!
  1. for /f "tokens=2" %%i in (..\tmp2.txt) do fsutil file createnew %%i %%i>nul
复制代码

换成了
  1. for /f "tokens=2" %%i in (..\tmp2.txt) do (
  2.     cd.>%%i
  3.     for /l %%j in (1,1,%%i) do echo.>>%%i
  4. )
复制代码

处理时间由 5 秒变成了 2 秒,佩服啊!

真想给此帖加精,可惜楼主是个只有三脚猫功夫的毛桃!
回复

使用道具 举报

5#
 楼主| 发表于 2006-11-25 19:04:39 | 显示全部楼层
原帖由 namejm 于 2006-11-25 17:11 发表

  名利乃身外之物,加精的目的是能让更多的人来关注,若能让更多的人对DOS批处理感兴趣的话,也不枉我写这几段代码了,这个精华加在谁的名下也就显得不那么重要了。若够得上精华帖的标准,毛桃兄只管加成精华 ...

呵呵,的确是将批处理发挥到了极致,至少我是这么认为的,加精,算到 Namejm 兄的名下,哈哈!

收藏备忘,以后常来温习温习。
回复

使用道具 举报

6#
 楼主| 发表于 2006-11-29 15:54:46 | 显示全部楼层
原帖由 namejm 于 2006-11-29 13:50 发表
  关于统计字符出现次数,更精彩的批处理代码请参考这个帖子,真正的叫人大开眼界:http://www.cn-dos.net/forum/view ... id=Z6IHFV#pid155049

呵呵,的确精彩,感谢 Namejm
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-5 18:05

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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