论文部分内容阅读
前几期我们讲到VBS脚本中,语句(statement)是构成语句(sentence)也叫句子的一部分。但请注意仔细辨析前后两个“语句”(英文单词可是不同的)是完全不同的概念。语句(statement)共有21个,有声明语句、判断语句、循环语句、分支选择语句、赋值语句、初始化语句等。下面介绍For...Next循环语句的用法。
一、查找指定关键词组合的句子并输出到文件
前几期介绍了批量替换文本文档中指定的内容来勘误错别字,这个范例有个缺陷,就是无法识别替换关键词与其前后字所组成的词语,比如:将“小边”替换成“小编”,假设有句子“走进狭小边缘地带”,替换后变成了“走进狭小编缘地带”,岂不弄巧成拙?如果事先把所有和“小边”组合的句子列出来,然后找出适宜的关键词来替换,这样定能事半功倍。本期范例批量查找文本文档中指定关键词组合的句子,并输出到文件名添加后缀“_Log”的文本文档中,以便筛选出恰当的关键词进行批量替换。
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Msgbox"单击“取消”或按“Esc”键结束选择文件。", vbInformation, "操作提示"
Set WshShell = WScript.CreateObject("WScript.Shell")
strMyDocuments = WshShell.SpecialFolders("MyDocuments")
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "文本文档(*.txt)|*.txt|所有文件|*.*"
objDialog.InitialDir = strMyDocuments
Do
intResult = objDialog.ShowOpen
If intResult <> 0 Then strSource = strSource & _
objDialog.FileName & vbCrLf
Loop Until intResult = 0
If strSource = "" Then
MsgBox "您没有选择任何文件,程序已结束。", vbInformation, "消息"
Wscript.Quit
End If
strFind = InputBox("请输入一个用于查找的关键词,可以是字母、符号、" & _
"单词、汉字、词、词组、成语、短语或者句子等等,然后单击" & _
"“确定”。", "关键词")
If strFind = "" Then
MsgBox "您没有输入有效的关键词,程序已结束。", vbInformation, "消息"
Wscript.Quit
End If
arrFiles = Split(strSource, vbCrLf)
Set objFso = CreateObject("Scripting.FileSystemObject")
For I = 0 To Ubound(arrFiles) - 1
Set objFile = objFso.OpenTextFile(arrFiles(I), ForReading, False)
strFindText = "" : intLin = 0
Do While objFile.AtEndOfStream <> True
strText = objFile.ReadLine
Do
intLin = intLin + 1
intPos = InStr(intPos + 1, strText, strFind)
If intPos <> 0 Then
strFindText = strFindText & "L: " & intLin & " N: " & intPos & " : "
If 0 >= intPos - 2 Then intStart = 1 Else intStart = intPos - 2
strTemp = Mid(strText, intStart, Len(strFind) + 4)
For J = 1 To Len(strTemp)
If Mid(strTemp, J, 1) >= " " Then
strFindText = strFindText & Mid(strTemp, J, 1)
End If
Next
strFindText = strFindText & vbCrLf
End If
Loop Until intPos = 0
Loop
objFile.Close
strLogFile = objFso.GetFile(arrFiles(I)).Path
strLogFile = Left(strLogFile, Len(strLogFile) - _
Len(objFso.GetExtensionName(strLogFile)) - 1) & "_Log.txt"
Set objFile = objFso.OpenTextFile(strLogFile, ForWriting, True)
objFile.Write strFindText
objFile.Close
Next
MsgBox "所选文件处理完毕,请查看当前文件夹中的记录文件。", vbInformation, "消息"
二、通透理解For...Next循环语句
1.For...Next循环语句
For...Next语句也是最常用的语句之一,用于循环执行指定次数的一组语句从而获得预期的计算结果。可以通俗地这样理解:假定从一个数开始数数,每数一个数就要做一件或多件事,一直数到最后一个数为止。在数数过程中,可以按一个固定的数相加(递增)或相减(递减)来跨步数数,比如:1、3、5、7,每次固定相加2,这个固定的数称作“步长(step)”,默认值为1。如果步长为正数表示递增,负数表示递减。开始数的那个数称作“初值”,数到最后那个数称作“终值”,初值和终值可以是正整数、零或负整数。做一件或多件事即执行一条或多条语句(sentence)。
2.For...Next语句的用法
For 计数器变量名 = 初值 To 终值 [Step 步长]
[语句]
[Exit For]
[语句]
Next
当For...Next循环启动时,首先将“初值”赋给“计数器变量”,接着测试“计数器变量”与“终值”,如果计数器变量超出终值,即递增大于或者递减小于终值,则结束循环;反之执行循环内的所有语句(sentence),其中当遇到经常由If...Then语句判断结果为真值执行Exit For语句即退出循环。然后将“步长”值加到计数器变量中(正数为相加,负数为相减),再次测试“计数器变量”与“终值”,继续下一次循环,一直到计数器变量超出终值时结束循环。同样,For...Next循环语句可以多重嵌套循环,但是每个循环中的“计数器变量名”不能相同。
3.下期预告:介绍For Each...Next语句和用法。
一、查找指定关键词组合的句子并输出到文件
前几期介绍了批量替换文本文档中指定的内容来勘误错别字,这个范例有个缺陷,就是无法识别替换关键词与其前后字所组成的词语,比如:将“小边”替换成“小编”,假设有句子“走进狭小边缘地带”,替换后变成了“走进狭小编缘地带”,岂不弄巧成拙?如果事先把所有和“小边”组合的句子列出来,然后找出适宜的关键词来替换,这样定能事半功倍。本期范例批量查找文本文档中指定关键词组合的句子,并输出到文件名添加后缀“_Log”的文本文档中,以便筛选出恰当的关键词进行批量替换。
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Msgbox"单击“取消”或按“Esc”键结束选择文件。", vbInformation, "操作提示"
Set WshShell = WScript.CreateObject("WScript.Shell")
strMyDocuments = WshShell.SpecialFolders("MyDocuments")
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "文本文档(*.txt)|*.txt|所有文件|*.*"
objDialog.InitialDir = strMyDocuments
Do
intResult = objDialog.ShowOpen
If intResult <> 0 Then strSource = strSource & _
objDialog.FileName & vbCrLf
Loop Until intResult = 0
If strSource = "" Then
MsgBox "您没有选择任何文件,程序已结束。", vbInformation, "消息"
Wscript.Quit
End If
strFind = InputBox("请输入一个用于查找的关键词,可以是字母、符号、" & _
"单词、汉字、词、词组、成语、短语或者句子等等,然后单击" & _
"“确定”。", "关键词")
If strFind = "" Then
MsgBox "您没有输入有效的关键词,程序已结束。", vbInformation, "消息"
Wscript.Quit
End If
arrFiles = Split(strSource, vbCrLf)
Set objFso = CreateObject("Scripting.FileSystemObject")
For I = 0 To Ubound(arrFiles) - 1
Set objFile = objFso.OpenTextFile(arrFiles(I), ForReading, False)
strFindText = "" : intLin = 0
Do While objFile.AtEndOfStream <> True
strText = objFile.ReadLine
Do
intLin = intLin + 1
intPos = InStr(intPos + 1, strText, strFind)
If intPos <> 0 Then
strFindText = strFindText & "L: " & intLin & " N: " & intPos & " : "
If 0 >= intPos - 2 Then intStart = 1 Else intStart = intPos - 2
strTemp = Mid(strText, intStart, Len(strFind) + 4)
For J = 1 To Len(strTemp)
If Mid(strTemp, J, 1) >= " " Then
strFindText = strFindText & Mid(strTemp, J, 1)
End If
Next
strFindText = strFindText & vbCrLf
End If
Loop Until intPos = 0
Loop
objFile.Close
strLogFile = objFso.GetFile(arrFiles(I)).Path
strLogFile = Left(strLogFile, Len(strLogFile) - _
Len(objFso.GetExtensionName(strLogFile)) - 1) & "_Log.txt"
Set objFile = objFso.OpenTextFile(strLogFile, ForWriting, True)
objFile.Write strFindText
objFile.Close
Next
MsgBox "所选文件处理完毕,请查看当前文件夹中的记录文件。", vbInformation, "消息"
二、通透理解For...Next循环语句
1.For...Next循环语句
For...Next语句也是最常用的语句之一,用于循环执行指定次数的一组语句从而获得预期的计算结果。可以通俗地这样理解:假定从一个数开始数数,每数一个数就要做一件或多件事,一直数到最后一个数为止。在数数过程中,可以按一个固定的数相加(递增)或相减(递减)来跨步数数,比如:1、3、5、7,每次固定相加2,这个固定的数称作“步长(step)”,默认值为1。如果步长为正数表示递增,负数表示递减。开始数的那个数称作“初值”,数到最后那个数称作“终值”,初值和终值可以是正整数、零或负整数。做一件或多件事即执行一条或多条语句(sentence)。
2.For...Next语句的用法
For 计数器变量名 = 初值 To 终值 [Step 步长]
[语句]
[Exit For]
[语句]
Next
当For...Next循环启动时,首先将“初值”赋给“计数器变量”,接着测试“计数器变量”与“终值”,如果计数器变量超出终值,即递增大于或者递减小于终值,则结束循环;反之执行循环内的所有语句(sentence),其中当遇到经常由If...Then语句判断结果为真值执行Exit For语句即退出循环。然后将“步长”值加到计数器变量中(正数为相加,负数为相减),再次测试“计数器变量”与“终值”,继续下一次循环,一直到计数器变量超出终值时结束循环。同样,For...Next循环语句可以多重嵌套循环,但是每个循环中的“计数器变量名”不能相同。
3.下期预告:介绍For Each...Next语句和用法。