找回密码
 加入
搜索
查看: 15993|回复: 22

[AU3基础] 读取TXT文本,指定搜寻条件,写入EXCEL。(已解决)

 火.. [复制链接]
发表于 2012-7-10 09:30:20 | 显示全部楼层 |阅读模式
本帖最后由 CCM 于 2012-7-12 11:55 编辑

很谢谢大家的帮助,目前已经完工,并修改标题,内容如下:


#include <array.au3>
#include <Excel.au3>
#include <file.au3>

HotKeySet("^c", "MyExit");设定中断热键

Local $var = FileOpenDialog("请选择要开启的档案", "c:\data", " TXT(*.txt) ")
Local $file = FileOpen($var)
$oExcel = _ExcelBookNew()

$line = FileRead($file)
$str = StringRegExp($line, ".+PCL\h+6.+", 3)
$prt = UBound($str) - 2


Local $i = 0
While $i <= $prt
        $name = StringRegExp($str[$i], '\d\.\h*(.+)\h*\(\w+\),\h*(.+)', 3)
        $name[0] = _ExcelWriteCell($oExcel, $name[0], $i + 1, 1)
        $name[1] = _ExcelWriteCell($oExcel, $name[1], $i + 1, 2)
        $i = $i + 1
WEnd

_ArrayDisplay($str, "请核对表机信息")

If UBound($str) = 1 Then
        MsgBox(0, "注意", "无法新增打印机信息,请手动处理。")
EndIf

_ExcelBookSaveAs($oExcel, "c:\data\Filename", "xls", 0)
If Not @error Then MsgBox(0, "打印机新增成功", "档案存盘完毕,请按确定结束。", 5)
_ExcelBookClose($oExcel, 1, 0)

Func MyExit();接续中断热键
        Exit
EndFunc   ;==>MyExit



发表于 2012-7-10 11:06:18 | 显示全部楼层
这个用正则非常简单,再不会也可以套用
Local $Str = _
                '[AU3基础] 读取TXT文本,并指定搜寻条件。' & @CRLF & _
                '打印机, 程序, 资料' & @CRLF & _
                '预设打印机:FX DocuCentre C5540 I PS (P125),winspool,Ne04:' & @CRLF & @CRLF & _
                '请问各位前辈,我有一个TXT文本,其中有上面的资料。' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '预设打印机:(\V+)', 1) ;(\V+) 关键字行后的所有字符
If Not @Error Then MsgBox(0, '预设打印机', $Test[0])
发表于 2012-7-10 11:14:48 | 显示全部楼层
回复 1# CCM

主要操作跟楼主上个提问帖应该是一致的吧?
    http://www.autoitx.com/forum.php ... 3225&highlight=

当然不用正则也可以做得来, 但相对麻烦多了. 数据量大时, 低效率就明显了.
自己比较吧

;关键字符串判断示例:
Local $str = '预设打印机:FX DocuCentre C5540 I PS (P125),winspool,Ne04:'

$n = StringInStr($str, '预设打印机:')
If $n Then
        $n += 5
        $str1 = StringTrimLeft($str, $n)
        MsgBox(0, '非正则截取内容', $str1)
EndIf

$str2 = StringRegExp($str, '预设打印机:(.*)', 3)
If Not @error Then MsgBox(0, '正则截取内容', $str2[0])

;完整示例1
#include<file.au3>
Local $f
_FileReadToArray('my.txt', $f)
If Not @error Then
        For $i = 1 To $f[0]
                $n = StringInStr($f[$i], '预设打印机:')
                If $n Then
                        $n += 5
                        $str = StringTrimLeft($f[$i], $n)
                        MsgBox(0, '文件行数: ' & $i, '其内容: ' & @CR & $str)
                EndIf
        Next
EndIf

;正则完整示例:
#include<array.au3>
$txt = FileRead('my.txt')
$str = StringRegExp($txt, '预设打印机:([^\r\n]+)', 3)
If Not @error Then _ArrayDisplay($str)
 楼主| 发表于 2012-7-10 12:00:15 | 显示全部楼层
谢谢两位,我再研究一下。

上次因为时间紧急,没有仔细想好整个脉络,这次有时间可以慢慢学习。
所以我打算从单一档案读取,到批次多档读取,一路练习上来。
单位有数百台电脑,能够做到批次的话,比较省人工。
发表于 2012-7-10 15:59:29 | 显示全部楼层
回复 6# CCM

'(\(\V+\))'
要匹配" ( "要用" \( " , 同理要匹配" ) "要用" \)"
 楼主| 发表于 2012-7-10 17:48:09 | 显示全部楼层
本帖最后由 CCM 于 2012-7-10 17:53 编辑

写到一半,同事看到,觉得这样不对,因为我们的TXT文档资料如下:

已安装打印机清单及预设打印机:
1. CutePDF Writer, CPW2:
2. FX ApeosPort-II 7000 PCL 6 (P102), \\printer\p102
3. HP LaserJet 4350 PCL 6 (P194), \\printer\p194
4. HP LaserJet P3010 Series PCL 6 (P198), \\printer\p198
5. Microsoft Office Document Image Writer, Microsoft Document Imaging Writer Port:
6. Microsoft XPS Document Writer, XPSPort:
7. PrimoPDF, PrimoPort:
预设打印机:HP LaserJet 4350 PCL 6 (P194),winspool,Ne04:


他说如果我只取预设打印机,那其他台打印机还是要手动安装,所以应该是分两个变数把1~7符合蓝色字的资料都抓出来,再写入EXCEL,我自己摸索StringRegExp及说明找不到该用哪个,求请高手帮帮忙。

以下是我目前的成果
#include<array.au3>
#include <Excel.au3>

HotKeySet("^c", "MyExit");設定中斷熱鍵

Local $var = FileOpenDialog("請選擇要開啟的檔案", "c:\data", " TXT(*.txt) ")
Local $file = FileOpen($var)

;read printer information
$line = FileRead($file)
$prn0 = StringRegExp($line, "登入帳戶:(\V+)", 1)
$prn1 = StringRegExp($line, "預設印表機:(\V+[\x20])", 1)

;write to excel
$oExcel = _ExcelBookNew()
$prn0 = _ExcelWriteCell($oExcel, $prn0 , 1)
$prn1 = _ExcelWriteCell($oExcel, $prn1, 1,3)


_ExcelBookSaveAs($oExcel, "c:\data" & @ComputerName, "xls", 0)
If Not @error Then MsgBox(0, "Success", "File was Saved!", 5)
_ExcelBookClose($oExcel, 1, 0)

Func MyExit();接續中斷熱鍵
        Exit
EndFunc   ;==>MyExit
发表于 2012-7-10 18:20:24 | 显示全部楼层
我是这样的理解的:
包含有" (P194), " 的行? 提取其前后的值?
'(\V+)\(P194\),(\V+)'
发表于 2012-7-10 19:52:04 | 显示全部楼层
说实话我不知道你这脚本是要干嘛,批量做什么?
发表于 2012-7-10 21:12:02 | 显示全部楼层
回复 7# CCM
$prn0 = StringRegExp($line, "登入帳戶:(\V+)", 1)
上面的正则返回的值是数组吧,写入excel的值需要$prn0[0]表示
发表于 2012-7-11 01:40:42 | 显示全部楼层
正则应该快速点
 楼主| 发表于 2012-7-11 13:39:09 | 显示全部楼层
本帖最后由 CCM 于 2012-7-11 13:49 编辑

TO 502762378
我们办公室有个VBS档案可以配合EXCEL批次安装打印机驱动程序及设定打印机编号,此外我们有个TXT收集计算机信息,因此只要能从这个TXT文件内抓取数据填入EXCEL,就可以大量批次安装打印机驱动程序。


TO xms77
$prn0 = StringRegExp($line, "登入账户:(\V+)", 1)
$prn0 = _ExcelWriteCell($oExcel, $prn0 , 1)

目前这样可以写入EXCEL,如果出错我再改您的方式,谢谢。

TO user3000
我反复测试正则的函式,目前以下的行式
$prn0 = StringRegExp($line, "([H]+\V+(6))", 1)
可以取到我要的 HP LaserJet P3010 Series PCL 6

不过档案里面会有
1. HP LaserJet P3010 Series PCL 6 (P138), \\printer\p138
2. CutePDF Writer, CPW2:
3. HP LaserJet P5100 Series PCL 6(P198), \\printer\p198
可能到56789,而且不是照順序...所以才想用StringRegExp來指定匹配字符

我用
while 1
$line = FileRead($file)
If @error = -1 Then ExitLoop
$prn0 = StringRegExp($line, "([H]+\V+(6))", 1)
WEnd

却只得到1的HP LaserJet P3010 Series PCL 6,3没有出现,我改用FileReadline却陷入无限LOOP...请问该怎么取值会比较好,还是有限制应该用别的方法?
发表于 2012-7-11 14:54:15 | 显示全部楼层
学习了。A大的正则式厉害。
发表于 2012-7-11 15:22:01 | 显示全部楼层
回复 12# CCM
我反复看了你此楼及7楼的内容, 还是弄不清楚你最后要匹配出什么样的结果.
目标文本已知时, 用正则匹配, 一般是直接进行全文匹配, 而不是单行匹配.
如果不能一次性匹配到目标字符, 可以在初次匹配的结果上进行多次正则, 直到获取到目标为止.
#include<array.au3>
Local $txt = _
                '已安装打印机清单及预设打印机:' & @CRLF & _
                '1. CutePDF Writer, CPW2:' & @CRLF & _
                '2. FX ApeosPort-II 7000 PCL 6 (P102), \\printer\p102' & @CRLF & _
                '3. HP LaserJet 4350 PCL 6 (P194), \\printer\p194' & @CRLF & _
                '4. HP LaserJet P3010 Series PCL 6 (P198), \\printer\p198' & @CRLF & _
                '5. Microsoft Office Document Image Writer, Microsoft Document Imaging Writer Port:' & @CRLF & _
                '6. Microsoft XPS Document Writer, XPSPort:' & @CRLF & _
                '7. PrimoPDF, PrimoPort:' & @CRLF & _
                '预设打印机:HP LaserJet 4350 PCL 6 (P194),winspool,Ne04:'
MsgBox(0, '原来文本内容', $txt)

$str = StringRegExp($txt, '.+PDF\h+Writer.+|.+PCL\h+6.+', 3)
_ArrayDisplay($str, '所有匹配内容')
;; 详细处理
If IsArray($str) Then
        MsgBox(0, '匹配数量', UBound($str))
        For $i = 0 To UBound($str) - 1
                If StringInStr($str[$i], '预设打印机') Then
                        $name = StringRegExp($str[$i], '预设打印机:(\V+)', 1)
                        If Not @error Then MsgBox(0, '预设打印机', $name[0])
                ElseIf StringInStr($str[$i], '(') Then
                        $name = StringRegExp($str[$i], '\d\.\h*(.+)\h*\(\w+\),\h*(.+)', 3)
                        If Not @error Then MsgBox(0, '第 ' & $i + 1 & ' 台打印机信息', '打印机名字:' & @TAB & $name[0] & @CR & '其共享名:' & @TAB & $name[1])
                Else
                        $name = StringRegExp($str[$i], '\d\.\h*([^\(\)]+)', 3)
                        If Not @error Then MsgBox(0, '第 ' & $i + 1 & ' 台打印机名: ', $name[0])
                EndIf
        Next
EndIf
 楼主| 发表于 2012-7-11 15:31:01 | 显示全部楼层
本帖最后由 CCM 于 2012-7-11 15:32 编辑
如果不能一次性匹配到目标字符, 可以在初次匹配的结果上进行多次正则, 直到获取到目标为止.

谢谢USER3000,我明白了。

你给的范例很实用,看完有种茅塞顿开的感觉,我会再继续研究练习。
发表于 2012-7-11 15:40:07 | 显示全部楼层
回复 15# CCM

嘻嘻, 我是看在你那个半通不通的正则份才做出14楼这么详细的回复的.
"([H]+\V+(6))" ("同一行字符里, 前面有大写的H后面有数字6",这个正则用 '(H\V+6)' 描述更合适.)
从上面看出, 你在解决自己问题的时是用心用脑子学习AU3的.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-16 16:06 , Processed in 0.080684 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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