找回密码
 加入
搜索
查看: 9180|回复: 21

[效率算法] 怎么合并计算,或者编程思路?

 火.. [复制链接]
发表于 2012-6-9 17:27:38 | 显示全部楼层 |阅读模式
处理前:
12345 2
12344 1
22110 2
12005 1
5512 2
22110 5
12344 3

处理后:
12345 2
12344 4
22110 7
12005 1
5512 2

数据前面是字符串,后面是数量,中间用一个TAB键分隔。。。
发表于 2012-6-9 18:39:25 | 显示全部楼层
实在看不懂你怎么从处理前‘计算’出处理后的结果的。
发表于 2012-6-9 19:10:57 | 显示全部楼层
回复 2# happytc

tab(这里的空格吧)前面是项目名称,后面是数值,名称相同的,对后面的数值求和
发表于 2012-6-9 19:45:59 | 显示全部楼层
这个如果用SQL 进行group by 就行了
但如果用AU3可能要数组。。。
数据量很多?
发表于 2012-6-9 20:13:31 | 显示全部楼层

#include <Array.au3>
Local $array
Local $read
Local $text
Local $write
Local $handle
Local $i
Local $j

$handle = FileOpen(@ScriptDir & "\w.txt", 0)
$read = FileRead($handle)
FileClose($handle)
$text = StringStripCR($read)
$array = StringSplit($text, @TAB & @LF)

;_ArrayDisplay($array, "处理前")
If BitAND($array[0], 0x00000001) Then
        _ArrayDelete($array, $array[0])
        $array[0] -= 1
EndIf

For $i = 1 To $array[0]-3 Step 2
        For $j = $array[0]-1 To $i+2 Step -2
                ;ConsoleWrite("i="&$i&" , j="&$j&" , array="&$array[$i]&" , array[j]="&$array[$j] & @CRLF)
                If Not StringCompare($array[$i], $array[$j]) Then
                        $array[$i+1] = Number($array[$i+1])+Number($array[$j+1])
                        _ArrayDelete($array, $j)
                        _ArrayDelete($array, $j)
                        $array[0] -= 2
                EndIf
        Next
Next
;ArrayDisplay($array, "处理后")

$write = ""
For $i = 1 To $array[0]-1 Step 2
        $write &= $array[$i] & @TAB & $array[$i+1] & @CRLF
Next

$handle  = FileOpen(@ScriptDir & "\w.txt", 10)
FileWrite($handle, $write)
FileClose($handle)

评分

参与人数 1金钱 +30 收起 理由
ivanpg + 30 谢谢

查看全部评分

发表于 2012-6-9 20:55:48 | 显示全部楼层
本帖最后由 afan 于 2012-6-9 21:06 编辑
Local $Str = _
                '12345        2' & @CRLF & _
                '12344        1' & @CRLF & _
                '22110        2' & @CRLF & _
                '12005        1' & @CRLF & _
                '5512        2' & @CRLF & _
                '22110        5' & @CRLF & _
                '12344        3'
MsgBox(0, '原字符串', $Str)
Local $aSR = StringRegExp($Str, '(\d+)        (\d+)', 3)
Local $sOut = '', $vTmp
For $i = 0 To UBound($aSR) - 1 Step 2
        If Not IsDeclared('!' & $aSR[$i]) Then
                Assign('!' & $aSR[$i], $aSR[$i + 1])
                $sOut &= $aSR[$i] & @TAB & $aSR[$i + 1] & @CRLF
        Else
                $vTmp = Eval('!' & $aSR[$i]) + $aSR[$i + 1]
                Assign('!' & $aSR[$i], $vTmp)
                $sOut = StringRegExpReplace($sOut, '(?<=(?<=^|\n)' & $aSR[$i] & @TAB & ')\d+', $vTmp)
        EndIf
Next
MsgBox(0, '合并计算', $sOut)

评分

参与人数 7金钱 +292 贡献 +51 收起 理由
ivanpg + 30
shqf + 30 + 5 强,又学到了新的东西
netegg + 100 + 25 果然妙,光想后者了,忘了可以处理前面了! ...
user3000 + 30 + 5 你是额滴神呀~!
auto + 22 只有佩服的份了

查看全部评分

发表于 2012-6-9 21:32:52 | 显示全部楼层
回复 6# afan
强就一个字!
发表于 2012-6-9 21:50:12 | 显示全部楼层
本帖最后由 happytc 于 2012-6-9 21:56 编辑

回复 6# afan


    在au3里,我还没有用过Assign函数和Eval函数呢,感觉忒落后了
叫我来写,肯定是最老套的方法:先排序数组,然后在循环里a[$i] vs a[$i+1]对比,判断退出循环条件就是不再有a[$i]=a[$i+1]
一描饭饭码,居然没有看懂,咋办呢,难道要求饭饭给每行个注释,好象有点过分。
学习了!
发表于 2012-6-9 21:58:19 | 显示全部楼层
回复 8# happytc


    其实很简单,抛开正则替换不说,有以下这三个函数一般处理这类问题就简单了
IsDeclared        检测变量是否已声明:这里设置的变量名为“!”开头的
Assign                给变量赋值
Eval                返回字符串变量的值
发表于 2012-6-9 22:31:31 | 显示全部楼层
本帖最后由 ainizm 于 2012-6-9 22:36 编辑

afan 说:说起编程,其实我这个人不是专业的,但是专业起来我就不是人了

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
user3000 + 10 + 1 和我想的一样啊, 给你加个分!

查看全部评分

发表于 2012-6-9 22:49:45 | 显示全部楼层
回复 9# afan


    谢谢了,学习了用这种方式来干这种事!

不知道若是大数量数据的话,如200M,这种方式效率怎么样(跟上面我说的老套方式比)
发表于 2012-6-9 22:52:26 | 显示全部楼层
回复 11# happytc


    这种方式效率是很高的,你有时间的话可以对比测试下~
发表于 2012-6-9 23:25:53 | 显示全部楼层
回复 12# afan


    只看楼主发在1楼的内容, 我完全不知道他要做什么.

看了您发在6楼的内容, 才恍然大悟了!
发表于 2012-6-9 23:59:47 | 显示全部楼层
回复 13# user3000
excel分类汇总
发表于 2012-6-10 01:19:49 | 显示全部楼层
本帖最后由 502762378 于 2012-6-10 02:12 编辑

琢磨了一晚上,终于搞出了菜鸟的法子
$out = ""
$string = 12345&@TAB&2&@crlf& _
12344&@TAB&1&@crlf& _
22110&@TAB&2&@crlf& _
12005&@TAB&1&@crlf& _
5512&@TAB&2&@crlf& _
22110&@TAB&5&@crlf& _
12344&@TAB&3
MsgBox(1,"",$string)
$m = StringSplit($string,@lf)
For $n = 1 To $m[0]
        $sstring = StringSplit($m[$n],@TAB)
        $out =  $out&$sstring[1]&@TAB&$sstring[2]+ Iniread("test.ini","test",$sstring[1],0)&@crlf
        If Iniread("test.ini","test",$sstring[1],0)>0 Then
        $out = StringRegExpReplace($out, $sstring[1]&@TAB&Iniread("test.ini","test",$sstring[1],0)&@crlf,"")
    endif
        IniWrite("test.ini","test",$sstring[1],$sstring[2]+IniRead("test.ini","test",$sstring[1],0))
next
MsgBox(1,"",$out)

评分

参与人数 1金钱 +20 收起 理由
ivanpg + 20

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-13 10:25 , Processed in 0.079425 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表