Board logo

标题: [文本处理] 【已解决】BAT:如何统计多个文本的数据范围值 [打印本页]

作者: 思想之翼    时间: 2014-9-17 04:10     标题: 【已解决】BAT:如何统计多个文本的数据范围值

本帖最后由 思想之翼 于 2014-9-17 23:02 编辑

d:/文本/文本1/001/lishi/内有若干文本 0-0000001.txt  0-0000002.txt  1-0000001.txt  2-0000001.txt  2-0000002.txt ......欲统计其记录的数据范围,示意如下:

若d:/文本/文本1/001/lishi/内有名称为0-0000001的txt文本,记录数据:
35 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
上述文本的第二列数据2,表示第一列数据35出现2次。第3-N列的数据忽略不计。 (下同)
现在统计0-0000001.txt数据,写成如下格式:
0-0=35-35=2-2
0-0表示0-0000001.txt文本名称的首位数值是0(下同)
35-35表示第1列数据(下同)
2-2表示第2列数据(下同)

若d:/文本/文本1/001/lishi/内除了0-0000001.txt外,还有名称为0-0000002的txt文本,记录数据:
35 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
41 285 115 29 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
现在统计0-0000001.txt  0-0000002.txt数据,写成如下格式:
0-0=35-35=2-8 (数据35出现的次数最小是2,最大是8。如果还有0-0000003.txt,数据35出现次数是3,则仍为2-8)
0-0=41-41=285-285

若d:/文本/文本1/001/lishi/内 还有名称为1-0000001的txt文本,记录数据:
5 28 22 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
现在统计0-0000001.txt  0-0000002.txt  1-0000001.txt数据,写成如下格式:
0-0=35-35=2-8
0-0=41-41=285-285
1-1=5-5=28-28

若d:/文本/文本1/001/lishi/内 还有名称为2-0000001的txt文本,记录数据:
0 562 22 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
现在统计0-0000001.txt  0-0000002.txt  1-0000001.txt 2-0000001.txt 数据,写成如下格式:
0-0=35-35=2-8
0-0=41-41=285-285
1-1=5-5=28-28
2-2=0-0=562-562

若d:/文本/文本1/001/lishi/内 还有名称为2-0000002的txt文本,记录数据:
0 195 22 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
现在统计0-0000001.txt  0-0000002.txt  1-0000001.txt 2-0000001.txt   2-0000002.txt 数据,写成如下格式:
0-0=35-35=2-8
0-0=41-41=285-285
1-1=5-5=28-28
2-2=0-0=195-562 (数据0出现的次数最小是195,最大是562。如果还有2-0000003.txt,数据0出现次数是223,则仍为195-562)

上述统计的最终结果,写入d:/文本/001.txt
作者: xxpinqz    时间: 2014-9-17 13:35

  1. @echo off
  2. cd /d "d:\文本\文本1\001\lishi\"
  3. set 最大文件前缀编号=2
  4. (for /l %%a in (0,1,%最大文件前缀编号%) do (
  5.      setlocal enabledelayedexpansion
  6.      for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>nul') do (
  7.           if not defined #_%%b_Min (
  8.              set/a #_%%b_Max=#_%%b_Min=%%c
  9.              set "str=!str! %%b"
  10.           ) else (
  11.                if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
  12.           )
  13.      )
  14.      for %%i in (!str!) do echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!
  15.      endlocal
  16. ))>d:\文本\001.txt
复制代码

作者: 思想之翼    时间: 2014-9-17 17:34

本帖最后由 思想之翼 于 2014-9-17 23:02 编辑

回复 2# xxpinqz

感谢您的帮助!圆满解决问题。

只是在代码扩展运用时,想将210个类似的代码合而为一,出现了如下的新问题:

@echo off
cd /d "d:\文本\文本1\001\lishi\"
set 最大文件前缀编号=2
(for /l %%a in (0,1,%最大文件前缀编号%) do (
     setlocal enabledelayedexpansion
     for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>nul') do (
          if not defined #_%%b_Min (
                     set/a #_%%b_Max=#_%%b_Min=%%c
                     set "str=!str! %%b"
          ) else (
               if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
          )
     )
     for %%i in (!str!) do echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!
     endlocal
))>d:\文本\001.txt


@echo off
cd /d "d:\文本\文本1\002\lishi\"
set 最大文件前缀编号=2
(for /l %%a in (0,1,%最大文件前缀编号%) do (
     setlocal enabledelayedexpansion
     for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>nul') do (
          if not defined #_%%b_Min (
                     set/a #_%%b_Max=#_%%b_Min=%%c
                     set "str=!str! %%b"
          ) else (
               if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
          )
     )
     for %%i in (!str!) do echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!
     endlocal
))>d:\文本\002.txt

.......

@echo off
cd /d "d:\文本\文本1\210\lishi\"
set 最大文件前缀编号=2
(for /l %%a in (0,1,%最大文件前缀编号%) do (
     setlocal enabledelayedexpansion
     for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>nul') do (
          if not defined #_%%b_Min (
                     set/a #_%%b_Max=#_%%b_Min=%%c
                     set "str=!str! %%b"
          ) else (
               if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
          )
     )
     for %%i in (!str!) do echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!
     endlocal
))>d:\文本\210.txt

以下是合并的代码,运行时出错了。烦请帮助修改:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%x in (1001,1,1210) do (
  3.     set y=%%x
  4. cd /d "d:\文本\文本1\!y:~1!\lishi\"
  5. set 最大文件前缀编号=2
  6. (for /l %%a in (0,1,%最大文件前缀编号%) do (
  7.      
  8.      for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>nul') do (
  9.           if not defined #_%%b_Min (
  10.                      set/a #_%%b_Max=#_%%b_Min=%%c
  11.                      set "str=!str! %%b"
  12.           ) else (
  13.                if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
  14.           )
  15.      )
  16.      for %%i in (!str!) do echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!
  17.      endlocal
  18. ))>d:\文本\!y:~1!.txt
  19. )
复制代码

作者: xxpinqz    时间: 2014-9-18 12:49

回复 3# 思想之翼
  1. @echo off
  2. set 最大文件前缀编号=2
  3. for /l %%x in (1001,1,1002) do (
  4.   set y=%%x
  5.   for /l %%a in (0,1,%最大文件前缀编号%) do (
  6.      setlocal enabledelayedexpansion
  7.      cd /d "d:\文本\文本1\!y:~1!\lishi\"
  8.      for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>nul') do (
  9.         if not defined #_%%b_Min (
  10.            set/a #_%%b_Max=#_%%b_Min=%%c
  11.            set "str=!str! %%b"
  12.         ) else (
  13.            if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
  14.         )
  15.      )
  16.   for %%i in (!str!) do echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!>>"d:\文本\!y:~1!.txt"
  17.   endlocal
  18.   )
  19. )
复制代码

作者: 思想之翼    时间: 2014-9-21 12:29

本帖最后由 思想之翼 于 2014-9-21 13:00 编辑

回复 2# xxpinqz

感谢您的帮助!
实际运用中,发现先前提问的叙述中存在一个漏洞,恳望继续得到您的帮助:

0-0000001.txt文本记录数据:
35 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
36 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
统计0-0000001.txt一个文本的数据,写成如下格式:
0-0=35-35=2-2
0-0=36-36=4-4

0-0000002.txt文本记录数据:
36 5 5 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
37 6 6 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
统计0-0000001.txt  0-0000002.txt多个文本的数据,写成如下格式:
0-0=35-35=0-2【漏洞:数据35在所有文本中没有全部出现,则最小值为0】
0-0=36-36=4-5
0-0=37-37=0-6【漏洞:数据37在所有文本中没有全部出现,则最小值为0】


统计1-0000001.txt  1-0000002.txt....多个文本的数据,同上;
统计2-0000001.txt  2-0000002.txt....多个文本的数据,同上。
作者: xxpinqz    时间: 2014-9-22 07:17

本帖最后由 xxpinqz 于 2014-9-22 07:24 编辑

回复 5# 思想之翼

按原来稍微改动下,没怎么测试,有个前提条件:每一个文件中不能有重复的数据,如:
35 2 0 0 0 0 0 0 0 .。。。。。
42 3 0 0 0 0 0 00 .。。。。。。。
35 88 00 0 0 0 0 .。。。。。。。
如上所示,35重复的,这样就不行,得重新写代码。
  1. @echo off
  2. set 最大文件前缀编号=2
  3. for /l %%x in (1001,1,1210) do (
  4.   set "y=%%x"
  5.   for /l %%a in (0,1,%最大文件前缀编号%) do (
  6.      setlocal enabledelayedexpansion
  7.      cd /d "d:\文本\文本1\!y:~1!\lishi\"
  8.      for /f "tokens=1-2" %%b in ('type %%a-???????.txt 2^>^&1') do (
  9.         set "tmp=%%b"
  10.         if /i "!tmp:~-4!"==".txt" (
  11.            set /a n+=1
  12.         ) else (
  13.            set /a #%%b+=1
  14.            if not defined #_%%b_Min (
  15.              set/a #_%%b_Max=#_%%b_Min=%%c
  16.              set "str=!str! %%b"
  17.            ) else (
  18.              if !#_%%b_Min! gtr %%c (set #_%%b_Min=%%c) else if !#_%%b_Max! lss %%c set "#_%%b_Max=%%c"
  19.            )
  20.         )
  21.      )
  22.   for %%i in (!str!) do (
  23.       if !#%%i! lss !n! set "#_%%i_Min=0"
  24.       echo,%%a-%%a=%%i-%%i=!#_%%i_Min!-!#_%%i_Max!>>"d:\文本\!y:~1!.txt"
  25.   )
  26.   endlocal
  27.   )
  28. )
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2