找回密码
 加入
搜索
查看: 4394|回复: 15

[效率算法] [已解决]不规则数据处理.

 火.. [复制链接]
发表于 2017-3-15 23:04:18 | 显示全部楼层 |阅读模式
本帖最后由 Mr丶KQ 于 2017-3-18 10:14 编辑

1.txt
25315|↓|25311
25429|←|25423
26307|空格|26301
27338|←|27335
27519|→|27513
27951|空格|27946
28961|←|28953
29181|↓|29177
29591|空格|29582
30369|↑|30360
30706|→|30703
30874|→|30874
31238|空格|31231
32055|←|32047
32311|↓|32304
32466|←|32464
32903|空格|32895
33463|↓|33455
33647|↑|33639
33818|↑|33815
;-------------------
2.txt
25603|←|25601
25651|↓|25650
26393|空格|26393
27579|←|27578
27635|→|27633
28023|空格|28016
29069|←|29066
29257|↓|29257
29655|空格|29649
30467|↑|30465
30773|→|30770
30947|→|30947
31303|空格|31298
32154|←|32154
32561|←|32561
32561|↓|32561
32959|空格|32954
33535|↓|33530
33705|↑|33705
33921|↑|33921
34592|空格|34584
35178|↑|35178
35612|↓|35610
35639|→|35633
36242|空格|36242
36970|↑|36962
36970|→|36962
37230|↓|37225
37883|空格|37883
38545|↑|38536
;-------------------
1.txt与2.txt对比后要的结果
25651|↓|25650
25603|←|25601
26393|空格|26393
27579|←|27578
27635|→|27633
28023|空格|28016
29069|←|29066
29257|↓|29257
29655|空格|29649
30467|↑|30465
30773|→|30770
30947|→|30947
31303|空格|31298
32154|←|32154
32561|↓|32561
32561|←|32561
32959|空格|32954
33535|↓|33530
33705|↑|33705
33921|↑|33921
;-------------------
这是目前有问题的代码:
#include <Array.au3>

$TwoToOneFullData1 = _FileRead(@ScriptDir & "\1.txt",0)
$FullEventKeyATMulti = StringRegExp($TwoToOneFullData1,"\V+",3)
$AllEventKeyATMulti = UBound($FullEventKeyATMulti)

$TwoToOneFullData2 = _FileRead(@ScriptDir & "\2.txt",0)
$FullEventKeyBOMulti = StringRegExp($TwoToOneFullData2,"\V+",3)
$AllEventKeyBOMulti = UBound($FullEventKeyBOMulti)

Local $FullKSData[$AllEventKeyATMulti][7]
Local $KSState1,$KSNumber1 = 0,$KSUse1 = ""

For $AT = 0 To $AllEventKeyATMulti - 1
        $KSState1 = 0

        $EventKeyAT2 = StringSplit($FullEventKeyATMulti[$AT],"|")

        $FullKSData[$AT][0] = $AT + 1
        $FullKSData[$AT][1] = $EventKeyAT2[1]
        $FullKSData[$AT][2] = $EventKeyAT2[2]
        $FullKSData[$AT][3] = $EventKeyAT2[3]

        For $BO = $KSNumber1 To $AllEventKeyBOMulti - 1
                If $KSUse1 <> $FullEventKeyBOMulti[$BO] Then
                        $EventKeyBO2 = StringSplit($FullEventKeyBOMulti[$BO],"|")

                        If ($EventKeyBO2[1] - $FullKSData[$AT][1] >= 0) And ($EventKeyBO2[2] = $FullKSData[$AT][2]) And ($EventKeyBO2[3] - $FullKSData[$AT][3] >= 0) Then
                                $FullKSData[$AT][4] = $EventKeyBO2[1]
                                $FullKSData[$AT][5] = $EventKeyBO2[2]
                                $FullKSData[$AT][6] = $EventKeyBO2[3]

                                $KSState1 = 1
                                $KSNumber1 += 1
                                $KSUse1 = $FullEventKeyBOMulti[$BO]

                                ExitLoop
                        EndIf
                EndIf
        Next

        If $KSState1 = 0 Then
                $FullKSData[$AT][5] = "/"
                $FullKSData[$AT][6] = "/"
        EndIf
Next

;[1]和[15]中的Col4、5、6 数值不正确
_ArrayDisplay($FullKSData,"")

Exit

Func _FileRead($RcdFile,$Mode = 0)
        Local $RcdFileOpen = FileOpen($RcdFile,$Mode)
        Local $RcdFileString = String(FileRead($RcdFileOpen))

        FileClose($RcdFileOpen)

        Return $RcdFileString
EndFunc
发表于 2017-3-16 07:08:33 | 显示全部楼层
........ 是合并去重复项?
一堆数,看得眼晕. 楼主是在透人玩吧
发表于 2017-3-16 09:50:52 | 显示全部楼层
我听楼上大婶说是逗人玩的,我也信了
发表于 2017-3-16 10:06:30 | 显示全部楼层
你可以把处理规则和结果简单说一下,不然还要让我们看结果猜规则么?
 楼主| 发表于 2017-3-16 14:26:08 | 显示全部楼层
本帖最后由 Mr丶KQ 于 2017-3-16 14:29 编辑

回复 4# 1361739590

哎呀.这怎么说了.
1.txt与2.txt的数据,如上面.
2.txt通过1.txt的数据进行对比.

也就是,非数字部分的数据要匹配
并且数字部分相减的话,不能为负数

如 25315|↓|25311 与 25651|↓|25650 匹配
发表于 2017-3-16 16:07:48 | 显示全部楼层
回复 5# Mr丶KQ


    哦知道一点了,数字相减不能为负数是指哪些数据相减呢?
 楼主| 发表于 2017-3-16 16:28:16 | 显示全部楼层
回复 6# 1361739590

25315|↓|25311 与 25603|←|25601 这样就不是匹配的
25315|↓|25311 与 25651|↓|25650 匹配
因为两个是↓.

且25651 - 25315和25650 - 25311
相减后,不为负数和小于500
发表于 2017-3-16 22:25:14 | 显示全部楼层
For $BO = $KSNumber1 To $AllEventKeyBOMulti - 1
改為
For $BO = 0 To $AllEventKeyBOMulti - 1

If ($EventKeyBO2[1] - $FullKSData[$AT][1] >= 0) And ($EventKeyBO2[2] = $FullKSData[$AT][2]) And ($EventKeyBO2[3] - $FullKSData[$AT][3] >= 0) Then
改為
If (($EventKeyBO2[1] - $FullKSData[$AT][1]) > 0) And (($EventKeyBO2[1] - $FullKSData[$AT][1]) < 500) And _
                                (($EventKeyBO2[3] - $FullKSData[$AT][3]) > 0) And (($EventKeyBO2[3] - $FullKSData[$AT][3]) < 500) And _
                                ($EventKeyBO2[2] == $FullKSData[$AT][2]) Then
 楼主| 发表于 2017-3-17 15:49:00 | 显示全部楼层
回复 8# Duvet

这只是把数据简化了
实际数据有1000多行.

为降低双循环占用的资源和提升效率.
For $BO = $KSNumber1
$KSNumber1 第二次循环开始不能为0
发表于 2017-3-17 16:18:27 | 显示全部楼层
;[1]和[15]中的Col4、5、6 数值不正确
我看是正确的啊。哪边不对。
发表于 2017-3-17 22:23:48 | 显示全部楼层
帮你顶
 楼主| 发表于 2017-3-18 10:12:00 | 显示全部楼层
;[1]和[15]中的Col4、5、6 数值不正确
我看是正确的啊。哪边不对。
1361739590 发表于 2017-3-17 16:18


已经解决了
3Q.
发表于 2017-3-18 14:14:45 | 显示全部楼层
能否請問一下,您是怎麼解決的?
 楼主| 发表于 2017-3-18 17:53:40 | 显示全部楼层
回复 13# Duvet

判定的话
如果索引相同则
$KSNumber1 = $AT 或者 $KSNumber1 = $BO

否则
只能将搜索到的索引位置对调
发表于 2017-3-20 09:09:22 | 显示全部楼层
回复 12# Mr丶KQ


    那你的500是怎么判断?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-25 00:47 , Processed in 0.074996 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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