Board logo

标题: [问题求助] 【已解决】vbs:加循环语句出错 [打印本页]

作者: 思想之翼    时间: 2013-10-27 17:25     标题: 【已解决】vbs:加循环语句出错

本帖最后由 思想之翼 于 2022-11-2 19:23 编辑

下列VBS代码仅对一个文本1.txt进行操作,结果输出为z1.txt。若有300个文本,就要制作300个类似的VBS,欲使之能够依次对1.txt  2.txt  3.txt...300.txt操作(1.txt  2.txt  3.txt...300.txt数据格式一样),结果依次输出为Z1.txt  Z2.txt  Z3.txt...Z300.txt   所以我尝试加了一句循环代码,不想出错了

Set fso = CreateObject("Scripting.FileSystemObject")
For x = 1 to 300
    Set file = fso.OpenTextFile(x & ".txt")

'原先是这句:Set file = fso.OpenTextFile("1.txt")  
m = 1 : Max = 0    'm=总列数,Max=输出最大行数
ReDim arIn(m-1) : ReDim arOut(m-1)

Do Until file.AtEndOfStream
   strLine = RegEx(file.ReadLine)
   If strLine <> "" Then
      ReDim PreServe ar(m-1,n)
      For i = 0 to m-1
         arIn(i) = arIn(i) & "$" & Split(strLine)(i) & " "
         ar(i,n) = arIn(i)
      Next
      n = n + 1
   End If
Loop

For i = 0 to m-1
   For j = CLng(n/2) to 0 step -1
      ar1 = Split(ar(i,n-1),ar(i,j))
      If UBound(ar1) > 1 Then
         For k = 1 to UBound(ar1) - 1
            a = UBound(Split(ar1(k))) - 1
            b = UBound(Split(ar(i,j))) - 1
            If a >= 0 Then
               arOut(i) = arOut(i)&Mid(Split(ar1(k))(a),2)&" "
            Else
               arOut(i) = arOut(i)&Mid(Split(ar(i,j))(b),2)&" "
            End If
         Next
         Exit For
      End If
   Next
   If UBound(Split(arOut(i))) > Max Then Max = UBound(Split(arOut(i)))
Next

For i = 0 to Max - 1
   For j = 0 to m-1
      If UBound(Split(arOut(j))) >= i Then
         strOut = strOut & Split(arOut(j))(i) & vbTab
      Else strOut = strOut & vbTab
      End If
   Next
   strOut = Left(strOut,Len(strOut)-1) & vbCrLf
Next


fso.OpenTextFile("z" & x & ".txt",2,true).Write strOut
'原先是这句:fso.OpenTextFile("z1.txt",2,True).Write strOut  

CreateObject("Wscript.Shell")

Function RegEx(strLine)
   Set re = New RegExp
   re.Pattern = "\s+"
   re.Global = True
   RegEx = Trim(re.Replace(strLine," "))
End Function
Next x
作者: apang    时间: 2013-10-27 18:18

本帖最后由 apang 于 2013-10-27 18:29 编辑

再把 CreateObject("Wscript.Shell")  这一行改成下面两行
strOut = "" : n = ""
Next
作者: 思想之翼    时间: 2013-10-27 18:44

回复 2# apang
谢谢您的帮助
按您指点修改了代码,还显示出错:

z1.txt文本可以输出,之后就出现下面的出错警告。我看了一下,z1.txt比z2.txt多1行数据,比z3.txt多2行数据,...可能z2.txt   z3.txt...z300.txt数据行数与z1.txt不一致,导致出错。如何修改?恳望指点。
作者: apang    时间: 2013-10-27 20:25

本帖最后由 apang 于 2013-10-27 20:26 编辑

哦,貌似错了
strOut = "" : n = 0
Next
试试
作者: 思想之翼    时间: 2013-10-28 00:07

回复 4# apang

谢谢您给予的大力帮助!
作者: apang    时间: 2013-10-28 12:53

是这个帖子吧?http://www.bathome.net/viewthread.php?tid=23404&highlight=
1.txt~300.txt列数必须相同,行数可以不相同。
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. m = 2  'm=总列数
  3. For x = 1 to 300
  4.     Set file = fso.OpenTextFile(x & ".txt")
  5.     fso.OpenTextFile("z" & x & ".txt",2,true).Write GetStr(file)
  6.     file.Close : Set file = Nothing
  7. Next
  8. Function GetStr(file)
  9.     ReDim arIn(m-1) : ReDim arOut(m-1)
  10.     Max = 0 : n = 0
  11.     Do Until file.AtEndOfStream
  12.         strLine = RegEx(file.ReadLine)
  13.         If strLine <> "" Then
  14.             ReDim PreServe ar(m-1,n)
  15.             For i = 0 to m-1
  16.                 arIn(i) = arIn(i) & "$" & Split(strLine)(i) & " "
  17.                 ar(i,n) = arIn(i)
  18.             Next
  19.             n = n + 1
  20.        End If
  21.     Loop
  22.     For i = 0 to m-1
  23.         For j = CLng(n/2) to 0 step -1
  24.             ar1 = Split(ar(i,n-1),ar(i,j))
  25.             If UBound(ar1) > 1 Then
  26.                 For k = 1 to UBound(ar1) - 1
  27.                     a = UBound(Split(ar1(k))) - 1
  28.                     b = UBound(Split(ar(i,j))) - 1
  29.                     If a >= 0 Then
  30.                         arOut(i) = arOut(i)&Mid(Split(ar1(k))(a),2)&" "
  31.                     Else
  32.                         arOut(i) = arOut(i)&Mid(Split(ar(i,j))(b),2)&" "
  33.                     End If
  34.                 Next
  35.                 Exit For
  36.             End If
  37.         Next
  38.         If UBound(Split(arOut(i))) > Max Then Max = UBound(Split(arOut(i)))
  39.     Next
  40.     For i = 0 to Max - 1
  41.         For j = 0 to m-1
  42.             If UBound(Split(arOut(j))) >= i Then
  43.                 strOut = strOut & Split(arOut(j))(i) & vbTab
  44.             Else strOut = strOut & vbTab
  45.             End If
  46.         Next
  47.         strOut = Left(strOut,Len(strOut)-1) & vbCrLf
  48.     Next
  49.     GetStr = strOut  
  50. End Function
  51. Function RegEx(strLine)
  52.    Set re = New RegExp
  53.    re.Pattern = "\s+"
  54.    re.Global = True
  55.    RegEx = Trim(re.Replace(strLine," "))
  56. End Function
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2