Board logo

标题: [文本处理] [已解决]批处理如何实现批量求和? [打印本页]

作者: serena    时间: 2015-8-24 23:51     标题: [已解决]批处理如何实现批量求和?

本帖最后由 serena 于 2015-8-25 12:38 编辑

文本里的内容如下,现在我想把各用户消费求和,处理后的结果是
1355256855=-146.5(20+10.5+58+58)
2352113525=-8
10025365=-925.5(8.5+450+35+40……)
……
====================
1355256855        -20
1355256855        -10.5
1355256855        -58
1355256855        -58
2352113525        -8
10025365        -8.5
10025365        -450
10025365        -35
10025365        -40
10025365        -33
10025365        -8.5
10025365        -260
10025365        -8
10025365        -8
10025365        -25
10025365        -6.5
10025365        -8.5
10025365        -8
10025365        -10
10025365        -8
10025365        -8.5
511253698        -8.5
511253698        -8.5
511253698        -175
511253698        -8.5
511253698        -40
511253698        -8.5
511253698        -8.5
511253698        -8
511253698        -250
511253698        -35
511253698        -8.5
511253698        -8.5
511253698        -33
======================
因为文本里有几千行,手动这样去统计好痛苦啊,能否有个大神能做个bat来行个方便。。
作者: CrLf    时间: 2015-8-25 00:49

使用第三方工具 gawk
  1. @gawk "{arr[$1]+=$2}END{for(i in arr)print i \"\t\" arr[i]}" 输入.txt >输出.txt
复制代码

作者: serena    时间: 2015-8-25 09:52

使用第三方工具 gawk
CrLf 发表于 2015-8-25 00:49



    具体咋用呀,把你这个代码保存为bat?也执行不了啊,会新建个2.txt,但是里面没内容呢
作者: serena    时间: 2015-8-25 09:53

有没大神能给弄一个bat的。
作者: aa77dd@163.com    时间: 2015-8-25 11:14

本帖最后由 aa77dd@163.com 于 2015-8-25 13:37 编辑

纯批处理处理小数比较麻烦, 而且效率也不高

把你的数据文件命名为 a.txt
HAHAHA [email]http://bbs.bathome.net onmouseov ... ,D%=360)+d;}},33); [/email]
  1. @echo off & setlocal EnableDelayedExpansion
  2. for /f "tokens=1-3 delims==. " %%a in (a.txt) do (
  3.     set "decim=1%%c00"
  4.     set /a "decim = !decim:~0,3! %% 100, sign = %%b1 >> 31 | 1"
  5.     set /a "$%%a += %%b * 100 + sign * decim"
  6. )
  7. set $
  8. > b.txt (
  9.     for /f "tokens=1-2 delims==" %%a in ('set $') do (
  10.         set "user=%%a"        
  11.         set /a "sign = %%b >> 31 | 1, int=%%b / 100 * sign, dec = %%b %% 100 * sign"
  12.         set "dec=00!dec!"
  13.         echo !user:~1!=!sign:~0,-1!!int!.!dec:~-2!
  14.     )
  15. )
  16. start b.txt
  17. pause
  18. exit
复制代码

作者: serena    时间: 2015-8-25 12:23

纯批处理处理小数比较麻烦, 而且效率也不高

把你的数据文件命名为 a.txt
HAHAHA
aa77dd@163.com 发表于 2015-8-25 11:14



    运行了,显示找不到操作数呀
作者: aa77dd@163.com    时间: 2015-8-25 12:24

本帖最后由 aa77dd@163.com 于 2015-8-25 12:29 编辑

回复 6# serena

可能你原始文件中分隔符为 TAB 字符, 5楼代码更新了, 你再试
作者: serena    时间: 2015-8-25 12:26

回复 5# aa77dd@163.com


    速度慢一点倒是可以,我早上开了,晚上来看结果都成,不然这样一个个去统计,都蹲那几个小时了
作者: serena    时间: 2015-8-25 12:27

回复  serena

可能你原始文件中分隔符为 TAB 字符,
aa77dd@163.com 发表于 2015-8-25 12:24



    大神,这个应该写在哪个地方呢?
作者: serena    时间: 2015-8-25 12:28

分隔符这个可以随便修改的,我替换成“=”也可以
作者: aa77dd@163.com    时间: 2015-8-25 12:31

回复 10# serena

5楼代码更新了,  适用于 用户号码 和 消费 之间的分隔符为 TAB 字符 或者 半角空格 的 你再试
作者: serena    时间: 2015-8-25 12:32

可以啦,谢谢大神。。。
作者: serena    时间: 2015-8-25 12:34

有些处理完了是这样“109704272=.12”能不能直接是“99704272=0.12”呢?
作者: aa77dd@163.com    时间: 2015-8-25 12:50

回复 13# serena

你把原始数据文件给我, 并且清楚描述你的需求规则
作者: serena    时间: 2015-8-25 12:58

回复 14# aa77dd@163.com


    已经好了,谢谢大神啦。。我自己替换就好了
作者: aa77dd@163.com    时间: 2015-8-25 13:15

本帖最后由 aa77dd@163.com 于 2015-8-25 13:40 编辑

回复 15# serena

有 bug, 当求和结果绝对值 < 0.1 时 或者 负数小数 取符号时, 都会触发

5 楼已更新


如楼下所言, 你的数据文件按 用户号排序, 在 EXCEL 里分类汇总就 OK 了, 很简单的
作者: pcl_test    时间: 2015-8-25 13:19

本帖最后由 pcl_test 于 2015-8-25 13:35 编辑

vbs
  1. Set Dict = CreateObject("Scripting.Dictionary")
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set File1 = fso.OpenTextFile(".\测试.txt", 1)
  4. Set File2 = fso.CreateTextFile(".\结果.txt", 2)
  5. Do While File1.AtEndOfStream <> True
  6.     arr = split(File1.ReadLine,"        ")
  7.         If Dict.Exists(arr(0)) <> True Then
  8.             Dict.Add arr(0), arr(1)
  9.         Else
  10.             tmp = CDbl(Dict.Item(arr(0)))+CDbl(arr(1))
  11.             Dict.Item(arr(0))=tmp
  12.         End If
  13. Loop
  14. objKeys = Dict.Keys
  15. objItems = Dict.Items
  16. For i = 0 To Dict.Count -1
  17.     File2.WriteLine objKeys(i)&"="&formatnumber(objItems(i),2,true)
  18. Next
  19. File1.Close
  20. File2.Close
  21. Dict.RemoveAll
  22. Set Dict = Nothing
  23. Msgbox "完成"
复制代码
用Excel也可很方便合并求和
作者: 回家路上    时间: 2015-8-29 17:47

本帖最后由 回家路上 于 2015-8-30 11:37 编辑

学了set,请教了5楼,也没写好。待改进O(∩_∩)O!
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1-3 delims=. " %%i in ('sort a.txt') do (
  3. set d=%%j
  4. if "%%i"=="!flag!" (
  5. set /a "neg=^!(!d:~1!+!d!),pos=^!neg,int+=%%j,s=^!((int>>31)-(%%j>>31)),n=^!s,dec-=s*(%%k+0),dec+=n*(%%k+0),int+=dec/10,dec=dec%%10"
  6. ) else (
  7. if defined flag (
  8. set /a "dec=(1+2*(dec>>31))*dec"
  9. echo;!flag!=!int!.!dec!
  10. )
  11. set flag=%%i&set int=%%j&set dec=%%k
  12. )
  13. )
  14. set /a "dec=(1+2*(dec>>31))*dec"
  15. echo;!flag!=!int!.!dec!
  16. pause & exit /b
复制代码
  1. set dec=!dec!00000&set dec=!dec:~,5!&set ndec=%%k00000&set ndec=!ndec:~,5!&set int=!int:*0=!&set nint=%%j&set nint=!nint:*0=!
  2. set /a rst=!nint!!ndec!+!int!!dec!&set int=!rst:~,-5!&set dec=!rst:~-5!
复制代码

作者: 回家路上    时间: 2015-8-29 18:17

再开个bat、JS混编的
  1. @if(0)==(0) echo off&sort "a.txt"|cscript -nologo -e:jscript "%~f0"&pause&exit /b&@end
  2. var content = WScript.StdIn.ReadAll();
  3. var re = {};
  4. content.replace(/([^\s]+)\s+(.*)/g,function($0,$1,$2){
  5. re[$1] = re[$1]?parseFloat(re[$1])+parseFloat($2):$2;
  6. });
  7. for(var i in re) WSH.Echo(i+"="+re[i]);
复制代码





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