找回密码
 加入
搜索
查看: 79848|回复: 11

[网络通信] [己解决]如何用AU3进行字符串匹配

  [复制链接]
发表于 2013-9-9 14:16:08 | 显示全部楼层 |阅读模式
本帖最后由 mpf5566 于 2013-9-13 11:29 编辑

各位大侠好,我附件中有两个EXCEL分别是“数据库”和“需对比文档”,请问如用AU3实现把“需对比文档”于“数据库里面”的字段进行对比匹配,然后输出“需对比文档”匹配上的结果呢???万分感谢!!!

本帖子中包含更多资源

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

×
 楼主| 发表于 2013-9-9 14:40:47 | 显示全部楼层
求救
发表于 2013-9-9 23:29:26 | 显示全部楼层
数据库量不大,使用Excel中的函数即可解决问题,当然可以使用Au3操作Excel直接写入公式。
发表于 2013-9-10 09:37:38 | 显示全部楼层
我也正准备弄个这工具,一直不想动手,人太懒了
 楼主| 发表于 2013-9-10 09:57:30 | 显示全部楼层
回复 3# xlj310


    那如果用AU3直接来实现不用EXCEL函数的话呢?请问有没有什么思路建议用到AU3哪些功能?比如用AU3查找“需对比文档”每一条和“数据库”进行匹配什么的。。。。
发表于 2013-9-10 10:30:07 | 显示全部楼层
$dic=ObjCreate("scripting.dictionary")
If Not IsObj($dic) Then
        MsgBox(0,"错误","创建字典对象失败!")
        Exit 0
EndIf
$oexcel=ObjCreate("excel.application")
If Not IsObj($oexcel) Then
        MsgBox(0,"错误","创建Excel进程失败!")
        Exit 0
EndIf
$oexcel.visible=True
$wb=$oexcel.workbooks.open(@ScriptDir&"\数据库.xlsx")
For $ws In $wb.worksheets
        With $ws
                $r=.cells(.rows.count,1).end(3).row
                If $r>1 Then
                        $arr=.range("a1").resize($r,2).value
                        For $n=0 To UBound($arr,2)-1
                                If $dic.exists($arr[1][$n]) Then
                                        $dic($arr[1][$n])=$dic($arr[1][$n])&@CRLF&$arr[0][$n]
                                Else
                                        $dic($arr[1][$n])=$arr[0][$n]
                                EndIf
                        Next
                EndIf
        EndWith
Next
$wb.close(False)
$wb=$oexcel.workbooks.open(@ScriptDir&"\需对比文档.xlsx")
For $ws In $wb.worksheets
        With $ws
                $r=.cells(.rows.count,1).end(3).row
                If $r>1 Then
                        $arr=.range("a1").resize($r,1).value
                        For $n=0 To UBound($arr,2)-1
                                If $dic.exists($arr[0][$n]) Then
                                        $arr[0][$n]=$dic($arr[0][$n])
                                Else
                                        $arr[0][$n]=""
                                EndIf
                        Next
                        .range("b1").resize($r,1).value=$arr
                        .columns.autofit
                        .rows.autofit
                EndIf
        EndWith
Next
MsgBox(0,"","对比完毕!")
$wb.close(true)
$oexcel.quit
$dic=0
这个试下

评分

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

查看全部评分

 楼主| 发表于 2013-9-10 11:54:23 | 显示全部楼层
回复 6# kevinch


    好的,多谢kevinch老师的帮忙,我先细细品味下您的代码!!需要学习东西好多,刚接触AU3接到的任务有点无从下手
 楼主| 发表于 2013-9-10 15:00:46 | 显示全部楼层
回复 6# kevinch
再次感谢下kevinch的热心帮助有几个问题小弟请教一下。
$dic=ObjCreate("scripting.dictionary");bjcreate引用了字典对象主要用于存储数组。
如果引用$dic.exists($arry[]1[&n])是否就意味着把数组附到$dic里面去了?
For $n=0 To UBound($arr,2)-1
                                If $dic.exists($arr[1][$n]) Then
                                        $dic($arr[1][$n])=$dic($arr[1][$n])&@CRLF&$arr[0][$n]
                                Else
                                        $dic($arr[1][$n])=$arr[0][$n]
                                EndIf



For $n=0 To UBound($arr,2)-1
                                If $dic.exists($arr[0][$n]) Then
                                        $arr[0][$n]=$dic($arr[0][$n])
                                Else
                                        $arr[0][$n]=""
                                EndIf

请问这两段代码是什么原理可以判断数组是否等价?能麻烦解释下原理么?多谢了
发表于 2013-9-10 15:32:30 | 显示全部楼层
本帖最后由 kevinch 于 2013-9-10 15:36 编辑

判断字典中是否存在该内容项相同的key,如果存在,就把item项用换行符串接,如果不存在就创建该项,exists是存在的意思,一般来说$dic(key)=item是赋值语句,$dic(key)就是直接使用对应的item项了

字典对象中key具有唯一性,默认情况下是二进行对比,即使是0和"0"都被认为是不同的,所以字典主要有两个用途,1是去除重复值(key唯一),2是快速查找($dic(key)即可以直接引用对应的item项了)
 楼主| 发表于 2013-9-10 17:28:19 | 显示全部楼层
回复 9# kevinch
kevinch你好恕我愚昧,字典对象看了这里的教程贴后还不是非常明白什么意思。是不是我们创建了数据组引用Dictionary对象变量如这里$dic.exits($arr)那么$arr数组的项目和key就存储在字典里面了?
我的理解是这样的。
;数据库里面是这样的
a00000001        pbx.netease.com
a00000002        192.168.130.11
a00000003        oa.netease.com
a00000004        vsp.netease.com
a00000005        her.x.netease.com
a00000006        webcgi.163.com
a00000007        csxy.163.com
a00000008        xyw.163.com
a00000009        xy2.163.com
a00000010        cms.netease.com
a00000011        xy3.163.com
a00000012        xyq.163.com
a00000013        pk.163.com
a00000014        dt.163.com
a00000015        wh.163.com
a00000016        dt2.163.com
a00000017        itown.163.com
a00000018        tk.163.com
.....                    ......
$wb=$oexcel.workbooks.open(@ScriptDir&"\数据库.xlsx")
For $ws In $wb.worksheets
        With $ws
                $r=.cells(.rows.count,1).end(3).row
                If $r>1 Then
                        $arr=.range("a1").resize($r,2).value;这个语句$arr的数组的对象就是上面的项目。
                        For $n=0 To UBound($arr,2)-1            ;UBound($arr,2)-1项目数量减1
                                If $dic.exists($arr[1][$n]) Then  ;字典对象存在$arr[1][$n],如这里$n=2 ;$arr[1][0]=pbx.netease.com;$arr[1][1]=192.168.130.11
                     $dic($arr[1][$n])=$dic($arr[1][$n])&@CRLF&$arr[0][$n];执行了这个语句后$arr[1][0]=pbx.netease.com&@CRLF&a00000001;$arr[1][1]=192.168.130.11&@CRLF&a00000002

                                Else
                                        $dic($arr[1][$n])=$arr[0][$n];那既然$arr[1][$n]都不为“”这一条语句还会执行么?
                                EndIf
                        Next
                EndIf
        EndWith
Next
$wb=$oexcel.workbooks.open(@ScriptDir&"\需对比文档.xlsx")
:对比文档
fs06
post.travel.163.com
news.163.com
blog.163.com
fs06
csc3-2004-crl.verisign.com
crl.verisign.com
csc3-2004-crl.verisign.com
crl.verisign.com
fs06
www.ne2008.com
post.travel.163.com
news.163.com
blog.163.com
img.nie.163.com
cs.nie.163.com
cs.nie.163.com
img.nie.163.com
cs.nie.163.com
fs06

For $ws In $wb.worksheets
        With $ws
                $r=.cells(.rows.count,1).end(3).row
                If $r>1 Then
                        $arr=.range("a1").resize($r,1).value;这里$arr的数据是$arr[0]=fs06;$arr[1]=post.travel.163.com;$arr[2]=news.163.com
                        For $n=0 To UBound($arr,2)-1;请问这里$arr是一维数组的话这里为什么UBound($arr,2)?
                                If $dic.exists($arr[0][$n]) Then;字典对象数据库数组$arr[0][0]=a00000001;$arr[0][1]=a00000002;$arr[0][2]=a00000003
                                        $arr[0][$n]=$dic($arr[0][$n]);这里是否把字典对象数据组$arr[0][0]=a00000001;$arr[0][1]=a00000002;$arr[0][2]=a00000003赋给$arr[0][0]=fs06;$arr[0][1]=post.travel.163.com?
                                Else
                                        $arr[0][$n]=""
                                EndIf
                        Next
                        .range("b1").resize($r,1).value=$arr;最后这个$arr的对比结果是怎么样的呢?
                        .columns.autofit
                        .rows.autofit
                EndIf
        EndWith
Next
不好意思本人基础浅薄,期待您的回答!!
发表于 2013-9-10 20:38:18 | 显示全部楼层
$ar=$dic.keys
用这句可以将key全部提取到数组$ar里,然后你循环来显示一下
for $t=0 to ubound($ar)-1
  ;这里显示一下$ar[$t]和$dic($ar[$t]),慢慢理解
next
 楼主| 发表于 2013-9-13 11:29:19 | 显示全部楼层
回复 11# kevinch


再次感谢下kevinch老师的人心帮助,通过这几天学习字典对象和excel在AU3里的函数引用,已经成功解决了难题。做出了自己第一个AU3实用的东西,感谢论坛。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-1 07:54 , Processed in 0.085278 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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