2013-08-12 30 views
0

我创建一个脚本来分裂的CSV文件,我希望让用户输入其文件被分割成新的区间。的VBScript用户输入变量

我遇到的问题是,当我输入的时间间隔是不分裂的,但还没有,如果我硬编码在它的价值不会分裂。

Option Explicit 

Const ForReading = 1 
Const ForWriting = 2 

Dim objFSO, objInputFile, objOutputFile 
Dim intLine, intFile 
Dim strHeaders 
Dim strInputFile, strOutputPrefix, strLine 
Dim MyDate 
Dim userSplit 
Dim split 

'strInputFile = InputBox("Enter file location") 
strInputFile = "H:\VBS\domS_CUST.csv" 
strOutputPrefix = strInputFile & DatePart("yyyy", Now) & "-" & DatePart("m", Now) & "-" & DatePart("d", Now) 


intFile = 1 
intLine = 0 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

Set objInputFile = objFSO.OpenTextFile(strInputFile, ForReading) 

If (objInputFile.AtEndOfStream = True) Then 
    ' The file is empty 
    WScript.Quit 1 
End If 

strHeaders = objInputFile.ReadLine 

userSplit = InputBox("Enter when you want to split") 

Do While (objInputFile.AtEndOfStream = False) 

split = userSplit 

    strLine = objInputFile.ReadLine 

    If (intLine <= 0) Then 
    Set objOutputFile = objFSO.CreateTextFile(strOutputPrefix & "_" & intFile & ".csv", True) 
    objOutputFile.WriteLine strHeaders 

    intLine = 1 
    End If 

    objOutputFile.WriteLine strLine 


    If (intLine >= split) Then 
    objOutputFile.Close 
    Set objOutputFile = Nothing 

    intFile = intFile + 1 
    intLine = 0 
    Else 
    intLine = intLine + 1 
    End If 
Loop 

输入是这一行:

userSplit = InputBox("Enter when you want to split") 

,我似乎无法得到它在这个值分割,任何帮助将不胜感激!

+0

你有没有考虑[铸造](http://www.pctools.com/guides/scrip ting/id/200 /?act = reference)你的字符串表达式是一个数字吗? – 2013-08-12 09:14:17

回答

2

你在你的代码,你没有表现出On Error Resume Next,否则该行

split = userSplit 

会一直引发的错误

非法转让: '分裂'

split是一个内置的功能的名称,因此它不能被用作变量名。这也是完全没有必要的,因为你可以简单地使用userSplit没有它的值赋给另一个变量。


更正:作为Ekkehard.Horner在评论中指出的那样,Dim split取代内置的函数定义,因此不会引发错误。


然而,最主要的原因,因为你希望你的代码不起作用的是,InputBox函数返回一个字符串值。为了正确地作出与intLine工作的比较,您需要将字符串转换为整数或长整型:

userSplit = CLng(InputBox("Enter when you want to split")) 
... 
If (intLine >= userSplit) Then 

你应该至少增加一个检查来处理在用户按下的情况下“取消”:

userSplit = CLng(InputBox("Enter when you want to split")) 
If userSplit <= 0 Then WScript.Quit 1 

此外,通过使用该Line财产,你的代码可以简化为这样:

filename = "H:\VBS\domS_CUST.csv" 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set infile = fso.OpenTextFile(filename) 

prefix = fso.BuildPath(fso.GetParentFolderName(filename) _ 
    , fso.GetBaseName(filename) & "_" & Year(Now) & "-" _ 
    & Right("0" & Month(Now), 2) & "-" & Right("0" & Day(Now), 2) & "_") 

userSplit = CLng(InputBox("Enter when you want to split")) 
If userSplit <= 0 Then WScript.Quit 1 

Do Until infile.AtEndOfStream 
    If infile.Line = 1 Then 
    headers = infile.ReadLine 
    Else 
    If (infile.Line - 2) Mod userSplit = 0 Then 
     If infile.Line > 2 Then outfile.Close 
     Set outfile = fso.CreateTextFile _ 
     (prefix & (infile.Line - 2) \ userSplit + 1 & ".csv", True) 
     outfile.WriteLine headers 
    End If 
    outfile.WriteLine infile.ReadLine 
    End If 
Loop 
outfile.Close 
+2

非常好的'重构'(+1)。只是一个NIT挑:如果您'昏暗split'(如弥敦道那样),则VBScript会接受'分= ...'。 –