找回密码
 加入
搜索
查看: 7625|回复: 17

[效率算法] 求一算法:枚举文件内容特定值到不同的数组

 火.. [复制链接]
发表于 2010-8-25 13:22:10 | 显示全部楼层 |阅读模式
小弟遇到一难题,求助:
一文本文件:data.log,想提取出N类数组到不同的数组里面,并得到每个数组在DATA.LOG里面
是多少行到多少行如:
array1     (1-6行)
5:5
4:5
5:5
5:5
5:4
5:5

array2    (7-11行)
738:737
738:734
739:736
739:735
738:735

array3   (12-17)
2496:2486
2494:2485
2497:2484
2496:2483
2496:2484
2495:2485
array4
。。。。。
。。。。。
依此类推

现在难点就在data.log的内容是随机的不知道data.log 有多少个 数值大小差不多的数组
也不知道每个数组有多少行,
简单的说data.log里面有多少个array1, array2,array3.................arrayn
也不知道array1, array2,array3.................arrayn 每个数组 有多少行。



DATA.LOG

"5:5:327685"
"4:5:327684"
"5:5:327685"
"5:5:327685"
"5:4:262149"
"5:5:327685"
"738:737:48300770"
"738:734:48104162"
"739:736:48235235"
"739:735:48169699"
"738:735:48169698"
"2496:2486:162924992"
"2494:2485:162859454"
"2497:2484:162793921"
"2496:2483:162728384"
"2496:2484:162793920"
"2495:2485:162859455"
"4987:4968:325587835"
"4988:4967:325522300"
"4990:4967:325522302"
"4988:4969:325653372"
"4989:4969:325653373"
"8398:8364:548151502"
"8400:8366:548282576"
"8399:8364:548151503"
"8400:8364:548151504"
"12945:12891:844837521"
"12946:12894:845034130"
"12947:12893:844968595"
"12947:12892:844903059"
"12947:12895:845099667"
"13316:12896:845165572"
"16813:16746:1097482669"
"16810:16742:1097220522"
"16811:16741:1097154987"
"16810:16745:1097417130"
"16813:16744:1097351597"
"21787:21699:1422087451"
"21789:21701:1422218525"
"21793:21701:1422218529"
"21789:21696:1421890845"
"21780:21691:1421563156"
"28231:28112:1842376263"
"28224:28109:1842179648"
"28227:28108:1842114115"
"28230:28108:1842114118"
"28226:28106:1841983042"
"30757:30630:2007398437"
"30750:30623:2006939678"
"30751:30623:2006939679"
"30745:30620:2006743065"
"30741:30612:2006218773"
"30745:30616:2006480921"
"30747:30621:2006808603"
"30750:30623:2006939678"
"30752:30625:2007070752"


本人自己的代码如下, 但没办法实现有多少个array N? arrayn 每个数组 有多少行
 楼主| 发表于 2010-8-25 13:23:06 | 显示全部楼层
Global $aRecords
If Not _FileReadToArray(@ScriptDir &"\data.log",$aRecords) Then
   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
   Exit
EndIf
Global $Param_min = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_min", "NotFound")       
Global $Param_max = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_max", "NotFound")
Global $Param_1 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_1", "NotFound")
Global $Param_2 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_2", "NotFound")
Global $Param_3 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_3", "NotFound")
Global $Param_4 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_4", "NotFound")
Global $Param_5 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_5", "NotFound")
Global $Param_6 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_6", "NotFound")
Global $Param_7 = IniRead(@ScriptDir &"\CPTest.ini", "Parameter", "Param_7", "NotFound")
Global $Left_array[$aRecords[0]]
Global $Right_array[$aRecords[0]]
Global $total_array[$aRecords[0]]
_Readdata()
_Master_Volume()

Func _Readdata()
Local $i
        For $i = 1 to $aRecords[0]
        $array=StringSplit($aRecords[$i],'"',2)
        $array1=StringSplit($array[1],':',2)
        $Left_array[$i-1]=$array1[0]
        $Right_array[$i-1]=$array1[1]
        $total_array[$i-1]=$array1[2]
Next

EndFunc

Func _Master_Volume()
        local $Right_array_1[3],$Right_array_2[3],$Right_array_3[3],$Right_array_4[3],$Right_array_5[3],$Right_array_6[3],$Right_array_7[3]
    local $Left_array_1[3],$Left_array_2[3],$Left_array_3[3],$Left_array_4[3],$Left_array_5[3],$Left_array_6[3],$Left_array_7[3]
        Local $StringWrite,$i
       
        For $i = 0 to UBound($Right_array)-1
                Switch $Right_array[$i]
                Case 0 to Number($Param_min)
                        $Right_array_1[1]=$Right_array[$i]
                        $Right_array_1[2]=$i+1
                case Number($Param_1) to Number($Param_2)
                        $Right_array_2[1]=$Right_array[$i]
                        $Right_array_2[2]=$i+1
                case Number($Param_2) to Number($Param_3)
                        $Right_array_3[1]=$Right_array[$i]
                        $Right_array_3[2]=$i+1
                       
                case Number($Param_3) to Number($Param_4)
                        $Right_array_4[1]=$Right_array[$i]
                        $Right_array_4[2]=$i+1
                case Number($Param_4) to Number($Param_5)
                        $Right_array_5[1]=$Right_array[$i]
                        $Right_array_5[2]=$i+1
                case Number($Param_5) to Number($Param_6)
                        $Right_array_6[1]=$Right_array[$i]
                        $Right_array_6[2]=$i+1
                case Number($Param_6) to Number($Param_7)
                        $Right_array_7[1]=$Right_array[$i]
                        $Right_array_7[2]=$i+1
                EndSwitch
               
                Switch $Left_array[$i]
                Case 0 to Number($Param_min)
                        $Left_array_1[1]=$Left_array[$i]
                        $Left_array_1[2]=$i+1
                case Number($Param_1) to Number($Param_2)
                        $Left_array_2[1]=$Left_array[$i]
                        $Left_array_2[2]=$i+1
                case Number($Param_2) to Number($Param_3)
                        $Left_array_3[1]=$Left_array[$i]
                        $Left_array_3[2]=$i+1
                case Number($Param_3) to Number($Param_4)
                        $Left_array_4[1]=$Left_array[$i]
                        $Left_array_4[2]=$i+1
                case Number($Param_4) to Number($Param_5)
                        $Left_array_5[1]=$Left_array[$i]
                        $Left_array_5[2]=$i+1
                case Number($Param_5) to Number($Param_6)
                        $Left_array_6[1]=$Left_array[$i]
                        $Left_array_6[2]=$i+1
                case Number($Param_6) to Number($Param_7)
                        $Left_array_7[1]=$Left_array[$i]
                        $Left_array_7[2]=$i+1
                EndSwitch
                       
                                  
                          Next
EndFunc


cptest.ini

[Parameter]
Param_1 = 100
Param_2 = 3000
Param_3 = 6000
Param_4 = 11000
Param_5 = 18000
Param_6 = 28000
Param_7 = 32770
Param_min = 20
Param_max =32750
发表于 2010-8-25 16:06:32 | 显示全部楼层
stringregexp(fileread("data.log"),'\b\d+:\d+',3)
发表于 2010-8-25 16:33:24 | 显示全部楼层
#Include <Array.au3>
#Include <File.au3>

$i1 = _FileCountLines("DATA.LOG")
Local $a

For $i = 1 To $i1

$file = "Tdata.txt";以Tdata.txt作为临时文件
$line = FileReadLine("DATA.LOG",$i)

$str = StringRegExp($line,'"(.+?):.*',3);读出第一个冒号的数值,并以此作为数组划分的依据
$num = StringLen($str[0]);读出第一个冒号数值的长度
IniWrite($file,$num,$i,$line)
Next

;以上,将DATA.LOG中的内容整理成了一个INI结构的临时文件
;下面,将临时文件中的内容写入数组

$s = IniReadSectionNames ("Tdata.txt");读取ini文件,确定数组的数量

For $i = 1 To $s[0]

$a = IniReadSection("Tdata.txt",$s[$i])
_ArrayDisplay($a,"数组"&$i)

Next
该下班了....
想了半天也只能做到这一步了

评分

参与人数 1金钱 +10 收起 理由
Robell_liu + 10

查看全部评分

发表于 2010-8-25 16:53:57 | 显示全部楼层
没搞懂最终目的…
发表于 2010-8-25 17:05:00 | 显示全部楼层
完成这段代码的过程中发现一个问题想不通啊。
首先想定义多个数组变量,本意是生成$array_1,$array_2,$array_3.....$array_N。
因为定义变量时不能用连结符& ,那么如何实时定义以上不确定的数组变量呢?
另一个问题:这里我用$array[$i]居然可以容纳数组?太不可思议了。
#include <array.au3>
$array_temp=stringregexp(fileread("data.log"),'\b\d+:\d+',3)
$str=_ArrayToString($array_temp,"|")
$array_number=StringSplit($array_temp[UBound($array_temp)-1],':')
$number=StringLen($array_number[1])
Local $array[$number+1]
For $i=$number To 1 Step -1
        $temp='\b\d{'&$i&'}:\d{'&$i&'}'
        $array[$i]=StringRegExp($str,$temp,3)
        _ArrayDisplay($array[$i],"$array"&"["&$i&"]")
Next

评分

参与人数 2金钱 +40 收起 理由
liufenglg + 20
Robell_liu + 20

查看全部评分

发表于 2010-8-25 17:06:11 | 显示全部楼层
以第一个“:”前面的数字位数划分? LZ自己的代码结果也不是啊,只是按“:”分离出了3个数组而已
 楼主| 发表于 2010-8-25 18:47:11 | 显示全部楼层
其实DATA.LOG是实时左右声道的振幅数据。
我每隔一秒移动一下Volume的进度条,这样data.log的数据是过一秒就往上递增一组数据。
"5:5:327685"   ~      "30752:30625:2007070752"
我现在就是想用程序判断我移动volume进度条0-100, 我保存的的左右声道数据也是也是一步步递增的 0~32786


由于data.log是通过音频对录线录音出来的数据流。
所以他每移动一次进度条,左右声道的数据增幅和record设备volume是多大有关:也就是
record设备volume 越大 , array2于array1的数值差异就越大。
还有由于时间搓可能有微小差异所以这个arrayn~ array2 ~array1的长度也不一样
 楼主| 发表于 2010-8-25 19:18:42 | 显示全部楼层
谢谢3mile的经典代码,能否再改进以下算法呢? 你的算法是各位,百位,千位,万位来算有多少个array
由于我每格一秒左右声道递增没有那么大,以下是调整4格的值,应该要4格数组
"16813:16744:1097351597"
"21789:21696:1421890845"
"28231:28112:1842376263"
"30752:30625:2007070752"
发表于 2010-8-25 23:48:28 | 显示全部楼层
回复 6# 3mile

的确有点不可思议
认真的看了一下, $array[$i]=StringRegExp($str,$temp,3)这句返回了一个数组,好像是$array[$i]已经被重新赋值了,所以,这个$array[$i]和原来用Local $array[$number+1]定义的$array虽然名字相同,但好像已经不是同一个数组了,已经因为重新被赋值而变成了一个新的数组。
再在代码最后添加了_ArrayDisplay ($array)语句来查看数组$array,好像数组内的数据和已经赋值的$array[$i]没有任何的关联
发表于 2010-8-25 23:53:59 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-8-26 00:02:18 | 显示全部楼层
回复 11# 3mile

这里的$array[2]被赋了1的值,是因为$array[$i]=StringRegExp($str,$temp,3)中的$i=2时,StringRegExp($str,$temp,3)并没有返回数组,而返回了1这个数值,所以在新赋值的数组中,$array[$i] 的$i = 2 时没有重新赋值数组,也就是没有形成了新的$array[2]数组,而是给以前定义的$array[2]赋上了1这个值。

不过这也挺混乱的
发表于 2010-8-26 00:20:42 | 显示全部楼层
回复 12# C.L
这样解释,看来是最符合逻辑了。多谢
发表于 2010-8-26 16:45:14 | 显示全部楼层
本帖最后由 Duvet 于 2010-8-31 20:18 编辑

看看是不是你要的?
游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

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

查看全部评分

 楼主| 发表于 2010-9-9 19:16:03 | 显示全部楼层
还有另外两种情况如果我是左边数递增, 或右边数递增,那我这个正则表达式如何写呢:
左边数递增如下:
"1:32768:-2147483647"
"1:32768:-2147483647"
"1:32768:-2147483647"
"1:32768:-2147483647"
"3393:32768:-2147480255"
"3393:32768:-2147480255"
"3393:32768:-2147480255"
"3393:32768:-2147480255"
"3393:32768:-2147480255"
"6784:32768:-2147476864"
"6785:32768:-2147476863"
"6784:32768:-2147476864"
"10176:32768:-2147473472"
"10176:32768:-2147473472"
"10176:32768:-2147473472"
"13568:32768:-2147470080"
"13568:32768:-2147470080"
"13568:32768:-2147470080"
"16960:32768:-2147466688"
"16960:32768:-2147466688"
"16960:32768:-2147466688"
"16960:32768:-2147466688"
"20352:32768:-2147463296"
"20352:32768:-2147463296"
"20352:32768:-2147463296"
"23743:32768:-2147459905"
"23743:32768:-2147459905"
"23743:32768:-2147459905"
"23743:32768:-2147459905"
"23743:32768:-2147459905"
"27135:32768:-2147456513"
"27135:32768:-2147456513"
"27135:32768:-2147456513"
"30527:32768:-2147453121"
"30527:32768:-2147453121"
"30527:32768:-2147453121"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
"32768:32768:-2147450880"

右边数递增如下:
"32768:1:98304"
"32768:1:98304"
"32768:1:98304"
"32768:1:98304"
"32768:1:98304"
"32768:1:98304"
"32768:1:98304"
"32768:3393:222396416"
"32768:3393:222396416"
"32768:6784:444628992"
"32768:6784:444628992"
"32768:10176:666927104"
"32768:10176:666927104"
"32768:13568:889225216"
"32768:13568:889225216"
"32768:16960:1111523328"
"32768:16960:1111523328"
"32768:16960:1111523328"
"32768:20351:1333755904"
"32768:20352:1333821440"
"32768:20884:1368686592"
"32768:23743:1556054016"
"32768:23743:1556054016"
"32768:27135:1778352128"
"32768:27135:1778352128"
"32768:27135:1778352128"
"32768:30527:2000650240"
"32768:30527:2000650240"
"32768:30527:2000650240"
"32768:30527:2000650240"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
"32768:32768:-2147450880"
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 02:27 , Processed in 0.097478 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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