找回密码
 加入
搜索
查看: 356|回复: 13

[AU3基础] [已解决]两个数组的运算,不知道哪里出错了

[复制链接]
发表于 2023-8-24 11:14:55 | 显示全部楼层 |阅读模式
本帖最后由 不是小灵通 于 2023-8-24 12:09 编辑

做一个签到表。
A数组记录的是员工名单(可能存在空行),B数组是记录的工号和登录时间(可能某些人存在多条记录)。拟将B数组的数据,添加至A数组中去。直接添加则OK,但若想并将未签到的记录标记出来,就出问题了,只显示了最后一次运算的时间,其余均为“未签到”。不知道哪里出了错,大家帮忙解释一下。
#include <array.au3>

Local $rows_A = 10
Local $rows_B = 4
Dim $array_A[$rows_A][4] = [[1,"001","张三",""],[2,"002","李四",""],[3,"003","王五",""],[4,"004","赵六",""],[5,"005","钱七",""],["","","",""],["","","",""],["","","",""],["","","",""],["","","",""]]
Dim $array_B[$rows_B][2] = [["001","2023-08-23 18:59:13"],["003","2023-08-23 19:59:13"],["001","2023-08-23 20:59:13"],["004","2023-08-23 21:59:13"]]

_ArrayDisplay($array_A,"$array_A",-1,0,"","","行号|序号|工号|姓名|最后登录时间")
_ArrayDisplay($array_B,"$array_B",-1,0,"","","行号|工号|最后登录时间(本列肯定是时间值越来越大)")

For $k = 0 To $rows_A - 1
        For $i = 0 To $rows_B - 1
                Select
                        Case $array_A[$k][1] = ""
                                 ExitLoop 2
                        Case $array_A[$k][1] = $array_B[$i][0]
                                $array_A[$k][3] = $array_B[$i][1]
                        Case $array_A[$k][1] <> $array_B[$i][0]
                                $array_A[$k][3] = "暂未登录";<--------------------------------不明白为什么想写入该行,就会丢失前面的数据?若该行不运行,则无此情况
                EndSelect
        Next
Next

_ArrayDisplay($array_A,"签到列表",-1,0,"","","行号|序号|工号|姓名|最后登录时间")

发表于 2023-8-24 15:56:16 | 显示全部楼层
不是小灵通 发表于 2023-8-24 12:04
谢谢A版。数据量并不大,教师机1个人使用,用来本地查询当前已签到的学生。
A表1个班约50个学生,B表不 ...

这点数据量无所谓了~
_ArrayDisplay 参4 的确是 $iFlags,如果不是就要查看帮助是否有相关选项了。
其实为此更新版本也没必要,创建个ListView列表把数组传进去也很简单
发表于 2023-8-24 11:51:39 | 显示全部楼层
#include <array.au3>
Local $rows_A = 10
Local $rows_B = 4
Dim $array_A[$rows_A][4] = [[1, "001", "张三", ""], [2, "002", "李四", ""], [3, "003", "王五", ""], [4, "004", "赵六", ""], [5, "005", "钱七", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""]]
Dim $array_B[$rows_B][2] = [["001", "2023-08-23 18:59:13"], ["003", "2023-08-23 19:59:13"], ["001", "2023-08-23 20:59:13"], ["004", "2023-08-23 21:59:13"]]
Local $sStr_B = _ArrayToString($array_B, '|'), $aTime
For $i = 0 To UBound($array_A) - 1
        If Not IsInt($array_A[$i][0]) Then ContinueLoop
        $aTime = StringRegExp($sStr_B, '(?m)^' & $array_A[$i][1] & '\|(\d{4}\V+)', 3)
        If Not @error Then
                $array_A[$i][3] = $aTime[UBound($aTime) - 1]
        Else
                $array_A[$i][3] = "未登陆"
        EndIf
Next
_ArrayDisplay($array_A, "签到列表", "", 0, "", "", "行号|序号|工号|姓名|最后登录时间")


发表于 2023-8-24 11:36:14 | 显示全部楼层
本帖最后由 txen548 于 2023-8-24 11:40 编辑
#include <array.au3>

Local $rows_A = 10
Local $rows_B = 4
Dim $array_A[$rows_A][4] = [[1, "001", "张三", ""],[2, "002", "李四", ""],[3, "003", "王五", ""],[4, "004", "赵六", ""],[5, "005", "钱七", ""],["", "", "", ""],["", "", "", ""],["", "", "", ""],["", "", "", ""],["", "", "", ""]]
Dim $array_B[$rows_B][2] = [["001", "2023-08-23 18:59:13"],["003", "2023-08-23 19:59:13"],["001", "2023-08-23 20:59:13"],["004", "2023-08-23 21:59:13"]]

_ArrayDisplay($array_A, "$array_A", -1, 0, "", "", "行号|序号|工号|姓名|最后登录时间")
_ArrayDisplay($array_B, "$array_B", -1, 0, "", "", "行号|工号|最后登录时间(本列肯定是时间值越来越大)")

For $k = 0 To $rows_A - 1
    For $i = 0 To $rows_B - 1
        Select
            Case $array_A[$k][1] = ""
                ExitLoop 2
            Case $array_A[$k][1] = $array_B[$i][0]
                $array_A[$k][3] = $array_B[$i][1]
                ContinueLoop 2 ; 跳过当前迭代并继续下一次迭代
        EndSelect
    Next
    $array_A[$k][3] = "暂未登录"
Next

_ArrayDisplay($array_A, "签到列表", -1, 0, "", "", "行号|序号|工号|姓名|最后登录时间")
C:\Users\Administrator\Desktop\微信截图_20230824113531.png

本帖子中包含更多资源

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

×
 楼主| 发表于 2023-8-24 11:34:03 | 显示全部楼层
本帖最后由 不是小灵通 于 2023-8-24 11:36 编辑

另外,如何不显示第1列的行号[0]...[9]?
是不是我的AU3版本低了?
#include <Array.au3> _ArrayDisplay(Const ByRef $avArray [, $sTitle = "Array: ListView Display" [, $iItemLimit = -1 [, $iTranspose = 0 [, $sSeparator = "" [, $sReplace = "|" [, $sHeader = ""]]]]]])
这里只有一个:[可选参数] listview 显示的最大行数
发表于 2023-8-24 11:43:26 | 显示全部楼层
不是小灵通 发表于 2023-8-24 11:34
另外,如何不显示第1列的行号[0]...[9]?
是不是我的AU3版本低了?
#include  _ArrayDisplay(Const ByRef ...

_ArrayDisplay 参4 改为 64.
p.s, 这样循环效率不高,数据量大的话可以用字典或Map
 楼主| 发表于 2023-8-24 11:44:36 | 显示全部楼层

感谢!写入号了就赶紧的跳出去嘛!有时候人就是会迂腐了,把简单事情弄复杂
 楼主| 发表于 2023-8-24 12:04:46 | 显示全部楼层
afan 发表于 2023-8-24 11:43
_ArrayDisplay 参4 改为 64.
p.s, 这样循环效率不高,数据量大的话可以用字典或Map

谢谢A版。数据量并不大,教师机1个人使用,用来本地查询当前已签到的学生。
A表1个班约50个学生,B表不定,应该不会超过100个(一般不会每个学生都去登录2次,还有还有缺课的)
另,关于行号,我的AU3版本参4是“转置”,看来回头得更新下了。
您说的版本估计是:
#include Array.au3
_ArrayDisplay ( Const ByRef $aArray [, $sTitle = ArrayDisplay [, $sArrayRange =  [, $iFlags = 0 [, $vUser_Separator = Default [, $sHeader = Default [, $iMax_ColWidth = Default [, $iAlt_Color = Default [, $hUser_Function = ]]]]]]]] )
,此版本的flags:64 - No 'Row' column displayed
 楼主| 发表于 2023-8-24 12:07:54 | 显示全部楼层

谢谢您的指导!我思路僵化了,先也是用的if来做的判断,也是因为同样的错误,才换成select的
发表于 2023-8-25 10:54:07 | 显示全部楼层
不是小灵通 发表于 2023-8-24 12:07
谢谢您的指导!我思路僵化了,先也是用的if来做的判断,也是因为同样的错误,才换成select的

一个数组就可以了,为何要二个数组?


#include <array.au3>
Local $rows_A = 10
Local $rows_B = 4
Dim $array_A[$rows_A][$rows_B] = [["001", "张三", "2023-08-23 18:59:13","登录"], ["002", "李四", "","未登录"], ["003", "王五", "2023-08-23 19:59:13","登录"], ["004", "赵六", "2023-08-23 21:59:13","登录"], ["005", "钱七", "","未登录"], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""]]
Local $a = "登录"
Global $eExcelArray3[$rows_A][$rows_B]
For $n = 0 To UBound($array_A) - 1
        For $i = 0 To UBound($array_A, 2) - 1
                If StringRegExp($array_A[$n][3], '(?mi)^\h*(' & $a & ')$') Then
                        $eExcelArray3[$n][$i] = $array_A[$n][$i]
                EndIf
        Next
Next
_ArrayDisplay($eExcelArray3, "签到列表","", 0, "|", "行号|序号|姓名|最后登录时间")

 楼主| 发表于 2023-8-25 12:30:43 | 显示全部楼层
chzj589 发表于 2023-8-25 10:54
一个数组就可以了,为何要二个数组?

要处理的实际情况是这样的:
1、我有2个MYSQL数据表,分别存放:学生名单,学生上机的登录信息(含登录时间)
2、考虑到一次性读取2个库,语句太过复杂,哪怕是建立临时库等等方式。
所以算法是:两库分别读取数据到本地后,分别存在AB数组内,然后进行学号比对,合并成一个“签到表”形式给任课老师查阅。
其中:A数组,是学生名单,比方说1-50学号,姓名,以及其他信息
B数组,是学号及登录时间。【但登录时间只是一个流水账,存在学生登录后退出了,再次登录等等原因,所以我取值是最后一次,即最晚一次的登录时间,没有记录,视作未登录(缺课)】
3、帖子里面的程序,是实现将B里面的、该学号的最后一条记录(最新登录时间),存放到A数组里面去。
其中,001号学生,我刻意设定了2次登录(全部登录顺序是:001,003,001,004,时间点可以看的出来)
4、上述各位热心朋友的回复其实并未完全解决问题,都没有获取到最新时间或其他问题。
 楼主| 发表于 2023-8-25 12:40:20 | 显示全部楼层
chzj589 发表于 2023-8-25 10:54
一个数组就可以了,为何要二个数组?

还有解释一下我正贴内容中“A数组记录的是员工名单(可能存在空行)
空行产生的原因可能是:课表中的学生人数,有时候是错的——与实际名单条数对不上,毕竟我们自编的数据并未与庞大的教务系统对接
比方说课表中显示是50人,也许有学生因为转班,导致实际人数与课表人数不符(比方说49人,甚至52人),当然程序中做了判断,不然数组会出错导致未知后果
发表于 2023-8-25 13:35:28 | 显示全部楼层
本帖最后由 chzj589 于 2023-8-25 14:04 编辑
不是小灵通 发表于 2023-8-25 12:30
要处理的实际情况是这样的:
1、我有2个MYSQL数据表,分别存放:学生名单,学生上机的登录信息(含登录 ...

你的数组也是要读取2个MYSQL数据表得到的,不是吗?
把得到数组合并为一个数组。
也可以读取2个MYSQL数据表写入TXT,然后读取TXT为数组再判断
 楼主| 发表于 2023-8-26 00:00:23 | 显示全部楼层
chzj589 发表于 2023-8-25 13:35
你的数组也是要读取2个MYSQL数据表得到的,不是吗?
把得到数组合并为一个数组。
也可以读取2个MYSQL数 ...

谢谢你的分析,我再慢慢琢磨和消化一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 18:52 , Processed in 0.090876 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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