2013-08-12 55 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會接受'分= ...'。 –