不是小灵通 发表于 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] = [,,,,,["","","",""],["","","",""],["","","",""],["","","",""],["","","",""]]
Dim $array_B[$rows_B] = [["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] = ""
                                 ExitLoop 2
                        Case $array_A[$k] = $array_B[$i]
                              $array_A[$k] = $array_B[$i]
                        Case $array_A[$k] <> $array_B[$i]
                              $array_A[$k] = "暂未登录";<--------------------------------不明白为什么想写入该行,就会丢失前面的数据?若该行不运行,则无此情况
                EndSelect
      Next
Next

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

afan 发表于 2023-8-24 15:56:16

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

这点数据量无所谓了~
_ArrayDisplay 参4 的确是 $iFlags,如果不是就要查看帮助是否有相关选项了。
其实为此更新版本也没必要,创建个ListView列表把数组传进去也很简单

zghwelcome 发表于 2023-8-24 11:51:39

#include <array.au3>
Local $rows_A = 10
Local $rows_B = 4
Dim $array_A[$rows_A] = [, , , , , ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""]]
Dim $array_B[$rows_B] = [["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]) Then ContinueLoop
        $aTime = StringRegExp($sStr_B, '(?m)^' & $array_A[$i] & '\|(\d{4}\V+)', 3)
        If Not @error Then
                $array_A[$i] = $aTime
        Else
                $array_A[$i] = "未登陆"
        EndIf
Next
_ArrayDisplay($array_A, "签到列表", "", 0, "", "", "行号|序号|工号|姓名|最后登录时间")


txen548 发表于 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] = [,,,,,["", "", "", ""],["", "", "", ""],["", "", "", ""],["", "", "", ""],["", "", "", ""]]
Dim $array_B[$rows_B] = [["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] = ""
                ExitLoop 2
            Case $array_A[$k] = $array_B[$i]
                $array_A[$k] = $array_B[$i]
                ContinueLoop 2 ; 跳过当前迭代并继续下一次迭代
      EndSelect
    Next
    $array_A[$k] = "暂未登录"
Next

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

不是小灵通 发表于 2023-8-24 11:34:03

本帖最后由 不是小灵通 于 2023-8-24 11:36 编辑

另外,如何不显示第1列的行号...?
是不是我的AU3版本低了?
#include <Array.au3> _ArrayDisplay(Const ByRef $avArray [, $sTitle = "Array: ListView Display" [, $iItemLimit = -1 [, $iTranspose = 0 [, $sSeparator = "" [, $sReplace = "|" [, $sHeader = ""]]]]]])
这里只有一个:[可选参数] listview 显示的最大行数

afan 发表于 2023-8-24 11:43:26

不是小灵通 发表于 2023-8-24 11:34
另外,如何不显示第1列的行号...?
是不是我的AU3版本低了?
#include_ArrayDisplay(Const ByRef ...

_ArrayDisplay 参4 改为 64.
p.s, 这样循环效率不高,数据量大的话可以用字典或Map

不是小灵通 发表于 2023-8-24 11:44:36

txen548 发表于 2023-8-24 11: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

zghwelcome 发表于 2023-8-24 11:51


谢谢您的指导!我思路僵化了,先也是用的if来做的判断,也是因为同样的错误,才换成select的

chzj589 发表于 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], '(?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人),当然程序中做了判断,不然数组会出错导致未知后果

chzj589 发表于 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数 ...

谢谢你的分析,我再慢慢琢磨和消化一下{:1_617:}
页: [1]
查看完整版本: [已解决]两个数组的运算,不知道哪里出错了