[己解决]如何用AU3进行字符串匹配
本帖最后由 mpf5566 于 2013-9-13 11:29 编辑各位大侠好,我附件中有两个EXCEL分别是“数据库”和“需对比文档”,请问如用AU3实现把“需对比文档”于“数据库里面”的字段进行对比匹配,然后输出“需对比文档”匹配上的结果呢???万分感谢!!!{:face (319):} {:face (394):}求救 数据库量不大,使用Excel中的函数即可解决问题,当然可以使用Au3操作Excel直接写入公式。 我也正准备弄个这工具,一直不想动手,人太懒了 回复 3# xlj310
那如果用AU3直接来实现不用EXCEL函数的话呢?请问有没有什么思路建议用到AU3哪些功能?比如用AU3查找“需对比文档”每一条和“数据库”进行匹配什么的。。。。{:face (394):} $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[$n]) Then
$dic($arr[$n])=$dic($arr[$n])&@CRLF&$arr[$n]
Else
$dic($arr[$n])=$arr[$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[$n]) Then
$arr[$n]=$dic($arr[$n])
Else
$arr[$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这个试下 回复 6# kevinch
好的,多谢kevinch老师的帮忙,我先细细品味下您的代码!!需要学习东西好多,刚接触AU3接到的任务有点无从下手{:face (52):} 回复 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[$n]) Then
$dic($arr[$n])=$dic($arr[$n])&@CRLF&$arr[$n]
Else
$dic($arr[$n])=$arr[$n]
EndIf
For $n=0 To UBound($arr,2)-1
If $dic.exists($arr[$n]) Then
$arr[$n]=$dic($arr[$n])
Else
$arr[$n]=""
EndIf
请问这两段代码是什么原理可以判断数组是否等价?能麻烦解释下原理么?多谢了 本帖最后由 kevinch 于 2013-9-10 15:36 编辑
判断字典中是否存在该内容项相同的key,如果存在,就把item项用换行符串接,如果不存在就创建该项,exists是存在的意思,一般来说$dic(key)=item是赋值语句,$dic(key)就是直接使用对应的item项了
字典对象中key具有唯一性,默认情况下是二进行对比,即使是0和"0"都被认为是不同的,所以字典主要有两个用途,1是去除重复值(key唯一),2是快速查找($dic(key)即可以直接引用对应的item项了) 回复 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[$n]) Then;字典对象存在$arr[$n],如这里$n=2 ;$arr=pbx.netease.com;$arr=192.168.130.11
$dic($arr[$n])=$dic($arr[$n])&@CRLF&$arr[$n];执行了这个语句后$arr=pbx.netease.com&@CRLF&a00000001;$arr=192.168.130.11&@CRLF&a00000002
Else
$dic($arr[$n])=$arr[$n];那既然$arr[$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=fs06;$arr=post.travel.163.com;$arr=news.163.com
For $n=0 To UBound($arr,2)-1;请问这里$arr是一维数组的话这里为什么UBound($arr,2)?
If $dic.exists($arr[$n]) Then;字典对象数据库数组$arr=a00000001;$arr=a00000002;$arr=a00000003
$arr[$n]=$dic($arr[$n]);这里是否把字典对象数据组$arr=a00000001;$arr=a00000002;$arr=a00000003赋给$arr=fs06;$arr=post.travel.163.com?
Else
$arr[$n]=""
EndIf
Next
.range("b1").resize($r,1).value=$arr;最后这个$arr的对比结果是怎么样的呢?
.columns.autofit
.rows.autofit
EndIf
EndWith
Next不好意思本人基础浅薄,期待您的回答!!{:face (245):} $ar=$dic.keys
用这句可以将key全部提取到数组$ar里,然后你循环来显示一下
for $t=0 to ubound($ar)-1
;这里显示一下$ar[$t]和$dic($ar[$t]),慢慢理解
next 回复 11# kevinch
再次感谢下kevinch老师的人心帮助,通过这几天学习字典对象和excel在AU3里的函数引用,已经成功解决了难题。做出了自己第一个AU3实用的东西,感谢论坛。
页:
[1]