3

我有一个带有多个分隔符(例如:、、、)的大文本文件(1 长~*:~定界符标记一个新的部分,和*定界符:标记子部分或段。

我尝试了以下方法,但出现类型不匹配错误,可能是因为该Split函数旨在用于字符串,而不是数组。

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

我正在尝试使用此逻辑将我的段和段字段保留在正确的部分中,并将这些值插入到数据库中。

关于如何使用 VBScript 完成此任务的任何想法?

4

3 回答 3

5

解决方案取决于如何将字段导入数据库。如果您只想按照它们在输入文件中出现的顺序处理所有字段,您可以用换行符替换分隔符,然后在换行符处拆分字符串:

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.Horner 已经指出的那样,为了进一步的帮助,您需要提供有关如何将层次结构导入数据库的更多信息。

于 2013-01-01T13:43:09.010 回答
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
于 2012-12-31T17:21:09.817 回答
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

(对于 Segment 和 Segfield 也是如此)。(另外:strFileLine (EEEEE:) 中的最后 6 个字符应为 FFFFF: ) 无论如何,Zaf 很好地表明,对于小数据,Redim Preserve 非常快!(他的解决方案可以保存为HTM文件进行测试(如果使用IE则在IE10模式下))

于 2014-06-01T07:52:44.450 回答