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

[文本处理] [已解决]批处理如何将批量文本相同数据的次数各自统计出来。

本帖最后由 a000000_82 于 2013-8-15 20:21 编辑

上月31日发贴“批处理如何将批量质检记录格式文本,统计每个文本指定字符列出现次数”,
求得一个统计批整理出多项数据,今请求各位大神再帮忙写个不同的统计批。



条件与内容如下:


“第三季检零配件汇总”文件夹内有文本数量0001.txt~9xxx.txt

如0001.txt和9xxx.txt内容为:

(0001.txt)文本内容为:

0001.txt:01,03,01,
0001.txt:05,
0001.txt:05,05,60,
0001.txt:09,
0001.txt:03,03,03,03,52


(9xxx.txt)文本内容为:

9xxx.txt:08,80,
9xxx.txt:12,xx,xx,xx,xx.xx,xx,xx,xx,
9xxx.txt:30,
9xxx.txt:02,


每个文本行数1~90不固定,数据列数不固定,单个数值为01,~90,数量不固定。(注:00,只是理论上存在)


批处理实现效果为:

将批量文本相同数据的次数各自统计出来分别写入文件夹:零配质统\xxxx.txt

如零配质统\0001.txt和零配质统\9xxx.txt内容为:

0001结果统计如下:
〖0001.00次〗:07,11,39,80,
〖0001.01次〗:09,52,60,


9xxx结果统计如下:
〖9xxx.00次〗:03,15,xx,xx,xx,
〖9xxx.01次〗:02,08,12,30,xx,xx,





批的要求说明:
1:批运行速度无要求,只为减轻工作量。
2:希望批尽量简单,以方便我这种只学会简单批的菜鸟学习、修改用于统计其它项目。


请大神帮忙,无尽感激~~~



另:在本论坛及网上找了半天,只找到两个类似的。
************************
注:下面这个只能统计单列,统计结果也是单列、次数结果是高向低(9-1)及结果没有00次。

(@gawk -vt=10000000000 "{ar[$0]++}END{l=asorti(ar,b);for(i=1;i<=l;i++) a[ar[b]+t,b];asorti(a);for(i=l;i>=1;i--) {split(a,b,SUBSEP);print b[1]%%t,b[2]}}")<第三季零配件质汇总\0001.txt >零配质统\0001.txt

************************
注:下面这个应该是彩票统计用的,试用打不开,但统计结果表达型式是我需要的类型。

VB使用Function函数统计次数...2012年01月03日 星期二 下午 8:52模块代码:

Function unique(data) '去掉数组重复
    If Not IsArray(data) Then
        data = Array()
    End If
    Dim dic, i
    Set dic = CreateObject("Scripting.Dictionary")
    For i = 0 To UBound(data)
        If Not dic.Exists("_" & data(i)) Then
            dic.Add "_" & data(i), data(i)
        End If
    Next
    unique = dic.Items
    Set dic = Nothing
End Function

Sub Sort(ByRef arr) '数字升序排序
    Dim i, j, t
    For i = 0 To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(i) > arr(j) Then
              t = arr(i)
              arr(i) = arr(j)
              arr(j) = t
            End If
        Next
    Next
End Sub

Function tongji(allmastr)    '统计函数
    On Error Resume Next
    Dim ma_arr: ma_arr = Split(allmastr, ",")
    Dim manum2(50)    '保存1-49对应的个数
    Dim i, i2, j
    For i = 0 To UBound(manum2)
        manum2(i) = 0
    Next
    For i = 0 To UBound(ma_arr)    '累加统计个数
        i2 = CInt(ma_arr(i))
        manum2(i2) = manum2(i2) + 1
    Next
    '获取次数列表
    Dim numarr1(50)
    For i = 1 To 49
        numarr1(i) = manum2(i)
    Next
    '去掉重复次数
    Dim numarr
    numarr = unique(numarr1)
    '次数从低到高排序
    Sort numarr
    Dim tjstr: tjstr = "结果统计如下:" & vbCrLf
    For i = 1 To UBound(numarr)
        Dim ci: ci = numarr(i)
        Dim cistr
        If ci < 10 Then
            cistr = "〖0" & ci & "次〗:"
        Else
            cistr = "〖" & ci & "次〗:"
        End If
        Dim mashu: mashu = 0
        For j = 1 To 49
            If manum2(j) = ci Then
                mashu = mashu + 1
                If j < 10 Then j = "0" & j
                cistr = cistr & j & ","
            End If
        Next
        cistr = cistr & "(共" & mashu & "个)" & vbCrLf
        tjstr = tjstr & cistr
    Next
    tongji = tjstr
End Function

Private Sub Command1_Click()
    Text2.Text = tongji(Text1.Text)
End Sub

例如:11,12,13,14,15,12,13,14,15,11,15,14,11,13

统计结果如下:

结果统计如下:
〖00次〗:01,02,03,04,05,06,07,08,09,10,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,(共44个)
〖02次〗:12,(共1个)
〖03次〗:11,13,14,15,(共4个)
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

很好用,谢谢apang 、terse ,两位大神帮忙!!

另外评分24小时内只能评一个,terse的评分明天给加上。

TOP

本帖最后由 terse 于 2013-8-15 20:49 编辑

没完全测试
去掉多余变量
  1. @echo off
  2. set files=零配质统
  3. pushd "D:\第三季检零配件汇总\"
  4. md "%files%" 2>nul
  5. for %%i in (*.txt) do (
  6.     setlocal enabledelayedexpansion
  7.     for /f "tokens=2 delims=:" %%a in (%%i) do (
  8.         for %%b in (%%a) do set /a #%%b+=1
  9.     )
  10.     for /L %%a in (0,1,90) do (
  11.         set "str=0%%a"
  12.         for %%b in ("!str:~-2!") do (
  13.               (for /f %%c in ("!#%%~b!") do set $%%c=!$%%c!%%~b;)||set $0=!$0!%%~b;
  14.         )
  15.     )
  16.      (echo %%~ni结果统计如下:
  17.       for /L %%a in (0,1,90) do if defined $%%a (
  18.           set str=0%%a
  19.           echo 〖%%~ni.!str:~-2!次〗:!$%%a!
  20.      ))>"!files!\%%i"
  21.      endlocal
  22. )
  23. pause
复制代码
1

评分人数

TOP

apang:

对不起,是我错了,看了你的回复,我检查了一下我测试的样本,才发现我试用的数据没有重复才出现那种情况,
从新用有重复数据测试很正常,十分抱嫌!!再说声对不起你了。
第一行少了下面一段,拜托再调整下,这行是准备所有文本合并作分隔及再提取不同次数用。
0001结果统计如下:
〖0001.02次〗:17,27,53,
〖0001.03次〗:09,12,18,25,26,43,48

                              谢谢

TOP

回复 3# a000000_82


    我测试可以的,把你的 0001.txt 样本附件传上来看看

TOP

先谢谢apang !!

刚试用了一下,
〖0001.00次〗:01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90
只出了这结果,请帮忙再改改。

TOP

  1. @echo off
  2. for /l %%a in (101 1 190) do set ".%%a=100"
  3. pushd "D:\第三季检零配件汇总\"
  4. for %%i in (*.txt) do (
  5.     setlocal enabledelayedexpansion
  6.     for /f "tokens=2delims=:" %%a in (%%i) do (
  7.         for %%b in (%%a) do set /a .1%%b+=1
  8.     )
  9.     for /f "tokens=1,2delims==." %%a in ('set .') do (
  10.         set "a=%%a" & set _%%b=!_%%b!,!a:~1!
  11.     )
  12.     (for /f "tokens=1,2delims==_" %%a in ('set _') do (
  13.         set "a=%%a" & set "b=%%b"
  14.         echo,〖%%~ni.!a:~1!次〗:!b:~1!
  15.     ))>"D:\零配质统\%%~ni_.txt"
  16.     endlocal
  17. )
  18. pause
复制代码
1

评分人数

TOP

返回列表