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

[文本处理] [已解决]批处理如何实现批量求和?

本帖最后由 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来行个方便。。
1

评分人数

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

再开个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]);
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

本帖最后由 回家路上 于 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!
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

本帖最后由 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也可很方便合并求和

TOP

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

回复 15# serena

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

5 楼已更新


如楼下所言, 你的数据文件按 用户号排序, 在 EXCEL 里分类汇总就 OK 了, 很简单的

TOP

回复 14# aa77dd@163.com


    已经好了,谢谢大神啦。。我自己替换就好了

TOP

回复 13# serena

你把原始数据文件给我, 并且清楚描述你的需求规则

TOP

有些处理完了是这样“109704272=.12”能不能直接是“99704272=0.12”呢?

TOP

可以啦,谢谢大神。。。

TOP

回复 10# serena

5楼代码更新了,  适用于 用户号码 和 消费 之间的分隔符为 TAB 字符 或者 半角空格 的 你再试

TOP

分隔符这个可以随便修改的,我替换成“=”也可以

TOP

回复  serena

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



    大神,这个应该写在哪个地方呢?

TOP

回复 5# aa77dd@163.com


    速度慢一点倒是可以,我早上开了,晚上来看结果都成,不然这样一个个去统计,都蹲那几个小时了

TOP

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

回复 6# serena

可能你原始文件中分隔符为 TAB 字符, 5楼代码更新了, 你再试

TOP

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

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



    运行了,显示找不到操作数呀

TOP

返回列表