怎么合并计算,或者编程思路?
处理前: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键分隔。。。 实在看不懂你怎么从处理前‘计算’出处理后的结果的。 回复 2# happytc
tab(这里的空格吧)前面是项目名称,后面是数值,名称相同的,对后面的数值求和 这个如果用SQL 进行group by 就行了
但如果用AU3可能要数组。。。
数据量很多?
#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 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) 回复 6# afan
强就一个字! 本帖最后由 happytc 于 2012-6-9 21:56 编辑
回复 6# afan
在au3里,我还没有用过Assign函数和Eval函数呢,感觉忒落后了
叫我来写,肯定是最老套的方法:先排序数组,然后在循环里a[$i] vs a[$i+1]对比,判断退出循环条件就是不再有a[$i]=a[$i+1]
一描饭饭码,居然没有看懂,咋办呢,难道要求饭饭给每行个注释,好象有点过分。
学习了! 回复 8# happytc
其实很简单,抛开正则替换不说,有以下这三个函数一般处理这类问题就简单了
IsDeclared 检测变量是否已声明:这里设置的变量名为“!”开头的
Assign 给变量赋值
Eval 返回字符串变量的值 本帖最后由 ainizm 于 2012-6-9 22:36 编辑
afan 说:说起编程,其实我这个人不是专业的,但是专业起来我就不是人了 回复 9# afan
谢谢了,学习了用这种方式来干这种事!
不知道若是大数量数据的话,如200M,这种方式效率怎么样(跟上面我说的老套方式比) 回复 11# happytc
这种方式效率是很高的,你有时间的话可以对比测试下~ 回复 12# afan
只看楼主发在1楼的内容, 我完全不知道他要做什么.
看了您发在6楼的内容, 才恍然大悟了! 回复 13# user3000
excel分类汇总 本帖最后由 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