2012-12-31 56 views
3

我有一個帶有多個分隔符的大文本文件(1長行)(例如:~,*,:)。 ~分隔符標記新節,並且*:分隔符標記子節或節。陣列上的拆分功能

我試過以下,但我得到一個類型不匹配的錯誤,可能是因爲Split函數是用於字符串,而不是數組。

Dim strFileLine, arrSection, arrSegment, arrSegField 
strFileLine = "C:\sometextfile.txt" 
arrSection = Split(strFileLine, "~") 
arrSegment = Split(arrSection, "*") 
arrSegField = Split(arrSegment, ":") 

我試圖用這個邏輯來保留我的段和段字段的正確部分,並將這些值插入到數據庫中。

有關如何使用VBScript完成此操作的任何想法?

+0

每個分隔符是否只出現一次?在每一行文字中? – Zeddy

+0

@Tondrey - 很容易說出你不應該期待/做的事情:將文件規範分配給變量不會加載他文件的內容; Split()會將一個字符串解析爲由'delimiter'(即分隔符)分隔的一個子字符串數組,但不會將此操作應用於數組的所有元素。但是,你應該給你輸入數據的一個*壓縮*樣本和關於你打算如何使用(分層?)分析數據的一些提示。文件格式是一個衆所周知的名稱/標準嗎? –

回答

5

解決方案取決於如何將字段導入數據庫。如果你只是想處理的順序它們出現在輸入文件中的所有領域,你可以更換新行的分隔符,然後分裂在換行的String:

Set fso = CreateObject("Scripting.FileSystemObject") 

Set text = fso.OpenTextFile("C:\sometextfile.txt").ReadAll 

text = Replace(text, "~", vbNewLine) 
text = Replace(text, "*", vbNewLine) 
text = Replace(text, ":", vbNewLine) 

arr = Split(text, vbNewLine) 

For Each field In arr 
    WScript.Echo field 
Next 

如果您需要更多地強調輸入文件的結構,你可以用嵌套循環處理輸入字符串:

Set fso = CreateObject("Scripting.FileSystemObject") 

Set text = fso.OpenTextFile("C:\sometextfile.txt").ReadAll 

For Each segment In Split(text, "~") 
    For Each section In Split(segment, "*") 
    For Each field In Split(section, ":") 
     WScript.Echo field 
    Next 
    Next 
Next 

對於你需要提供有關的層次結構應如何導入到數據庫中,作爲Ekkehard更多信息進一步的援助。霍納已經指出。

+0

非常感謝!這完全有幫助。 – tkwargs

0
 Dim strFileLine 
    Dim arrSection() 
    Dim arrSegment() 
    Dim arrSegField() 
    Dim strBuf 
    Dim counta 
    Dim character 
    dim sectioncount 
    dim segmentcount 
    dim segfieldcount 

    strFileLine = "aaaaa~00000?AAAAA:bbbbb~11111?BBBBB:ccccc~22222?CCCCC:ddddd~33333?DDDDD:eeeee~44444?EEEEE:fffff~55555?EEEEE:" 
    strBuf = "" 
    For counta = 1 To Len(Trim(strFileLine)) 
     character = Mid(strFileLine, counta, 1) 
     Select Case character 
      Case "~" 
       sectioncount = sectioncount + 1 
       redim preserve arrSection(sectioncount - 1) 
       arrSection(sectioncount-1)=strBuf 
       strBuf = "" 
      Case "?" 
       segmentcount = segmentcount + 1 
       redim preserve arrSegment(segmentcount - 1) 
       arrSegment(segmentcount-1)=strBuf 
       strBuf = "" 
      Case ":" 
       segfieldcount = segfieldcount + 1 
       redim preserve arrSegField(segfieldcount - 1) 
       arrSegField(segfieldcount-1)=strBuf 
       strBuf = "" 
      Case Else 
       strBuf = strBuf & character 
     End Select 
    Next 
    For counta = 0 To ubound(arrSection)-1 
     document.Write("SECTION:=" & arrSection(counta) & "<br/>") 
    Next 
    For counta = 0 To ubound(arrSegment)-1 
     document.Write("SEGMENT:=" & arrSegment(counta) & "<br/>") 
    Next 
    For counta = 0 To ubound(arrSegField)-1 
     document.Write("SEGFIELD:=" & arrSegField(counta) & "<br/>") 
    Next 
0

要獲得Zaf解決方案中缺失的第五部分(第5部分/第5部分/第5部分區域),必須從FOR循環中刪除-1。例如:

redim preserve arrSection(sectioncount) 
arrSection(sectioncount) = strBuf 
sectioncount = sectioncount + 1 
strBuf = "" 

For counta = 0 To ubound(arrSection) 'REMOVE -1 from here 
    document.Write("SECTION " & counta & " : " & arrSection(counta) & "<br>") 
Next 

(對於段& Segfield同樣的事情)。 (另外:strFileLine(EEEEE :)中的最後6個字符應該讀取FFFFF:) 無論如何,Zaf很好地表明,對於小數據,Redim Preserve非常快! (他的解決方案可以保存爲HTM文件進行測試(如果使用IE,則在IE10模式下))