标题: [文本处理] [已解决]批处理如何实现批量求和? [打印本页]
作者: 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- @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]- @echo off & setlocal EnableDelayedExpansion
-
- for /f "tokens=1-3 delims==. " %%a in (a.txt) do (
- set "decim=1%%c00"
- set /a "decim = !decim:~0,3! %% 100, sign = %%b1 >> 31 | 1"
- set /a "$%%a += %%b * 100 + sign * decim"
- )
- set $
- > b.txt (
- for /f "tokens=1-2 delims==" %%a in ('set $') do (
- set "user=%%a"
- set /a "sign = %%b >> 31 | 1, int=%%b / 100 * sign, dec = %%b %% 100 * sign"
- set "dec=00!dec!"
- echo !user:~1!=!sign:~0,-1!!int!.!dec:~-2!
- )
- )
- start b.txt
- pause
- 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- Set Dict = CreateObject("Scripting.Dictionary")
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set File1 = fso.OpenTextFile(".\测试.txt", 1)
- Set File2 = fso.CreateTextFile(".\结果.txt", 2)
- Do While File1.AtEndOfStream <> True
- arr = split(File1.ReadLine," ")
- If Dict.Exists(arr(0)) <> True Then
- Dict.Add arr(0), arr(1)
- Else
- tmp = CDbl(Dict.Item(arr(0)))+CDbl(arr(1))
- Dict.Item(arr(0))=tmp
- End If
- Loop
- objKeys = Dict.Keys
- objItems = Dict.Items
- For i = 0 To Dict.Count -1
- File2.WriteLine objKeys(i)&"="&formatnumber(objItems(i),2,true)
- Next
- File1.Close
- File2.Close
- Dict.RemoveAll
- Set Dict = Nothing
- Msgbox "完成"
复制代码
用Excel也可很方便合并求和
作者: 回家路上 时间: 2015-8-29 17:47
本帖最后由 回家路上 于 2015-8-30 11:37 编辑
学了set,请教了5楼,也没写好。待改进O(∩_∩)O!- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1-3 delims=. " %%i in ('sort a.txt') do (
- set d=%%j
- if "%%i"=="!flag!" (
- 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"
- ) else (
- if defined flag (
- set /a "dec=(1+2*(dec>>31))*dec"
- echo;!flag!=!int!.!dec!
- )
- set flag=%%i&set int=%%j&set dec=%%k
- )
- )
- set /a "dec=(1+2*(dec>>31))*dec"
- echo;!flag!=!int!.!dec!
- pause & exit /b
复制代码
- 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=!
- set /a rst=!nint!!ndec!+!int!!dec!&set int=!rst:~,-5!&set dec=!rst:~-5!
复制代码
作者: 回家路上 时间: 2015-8-29 18:17
再开个bat、JS混编的- @if(0)==(0) echo off&sort "a.txt"|cscript -nologo -e:jscript "%~f0"&pause&exit /b&@end
-
- var content = WScript.StdIn.ReadAll();
- var re = {};
- content.replace(/([^\s]+)\s+(.*)/g,function($0,$1,$2){
- re[$1] = re[$1]?parseFloat(re[$1])+parseFloat($2):$2;
- });
- for(var i in re) WSH.Echo(i+"="+re[i]);
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |