ivanpg 发表于 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键分隔。。。

happytc 发表于 2012-6-9 18:39:25

实在看不懂你怎么从处理前‘计算’出处理后的结果的。

netegg 发表于 2012-6-9 19:10:57

回复 2# happytc

tab(这里的空格吧)前面是项目名称,后面是数值,名称相同的,对后面的数值求和

auto 发表于 2012-6-9 19:45:59

这个如果用SQL 进行group by 就行了
但如果用AU3可能要数组。。。
数据量很多?

veket_linux 发表于 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, 0x00000001) Then
        _ArrayDelete($array, $array)
        $array -= 1
EndIf

For $i = 1 To $array-3 Step 2
        For $j = $array-1 To $i+2 Step -2
                ;ConsoleWrite("i="&$i&" , j="&$j&" , array="&$array[$i]&" , array="&$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 -= 2
                EndIf
        Next
Next
;ArrayDisplay($array, "处理后")

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

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

afan 发表于 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)

xms77 发表于 2012-6-9 21:32:52

回复 6# afan
强就一个字!

happytc 发表于 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]
一描饭饭码,居然没有看懂,咋办呢,难道要求饭饭给每行个注释,好象有点过分。
学习了!

afan 发表于 2012-6-9 21:58:19

回复 8# happytc


    其实很简单,抛开正则替换不说,有以下这三个函数一般处理这类问题就简单了
IsDeclared        检测变量是否已声明:这里设置的变量名为“!”开头的
Assign                给变量赋值
Eval                返回字符串变量的值

ainizm 发表于 2012-6-9 22:31:31

本帖最后由 ainizm 于 2012-6-9 22:36 编辑

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

happytc 发表于 2012-6-9 22:49:45

回复 9# afan


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

不知道若是大数量数据的话,如200M,这种方式效率怎么样(跟上面我说的老套方式比)

afan 发表于 2012-6-9 22:52:26

回复 11# happytc


    这种方式效率是很高的,你有时间的话可以对比测试下~

user3000 发表于 2012-6-9 23:25:53

回复 12# afan


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

看了您发在6楼的内容, 才恍然大悟了!

netegg 发表于 2012-6-9 23:59:47

回复 13# user3000
excel分类汇总

502762378 发表于 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
        $sstring = StringSplit($m[$n],@TAB)
        $out =$out&$sstring&@TAB&$sstring+ Iniread("test.ini","test",$sstring,0)&@crlf
        If Iniread("test.ini","test",$sstring,0)>0 Then
        $out = StringRegExpReplace($out, $sstring&@TAB&Iniread("test.ini","test",$sstring,0)&@crlf,"")
    endif
        IniWrite("test.ini","test",$sstring,$sstring+IniRead("test.ini","test",$sstring,0))
next
MsgBox(1,"",$out)
页: [1] 2
查看完整版本: 怎么合并计算,或者编程思路?