将通过字符串解析生成的多个记录分配给VBA数组

时间:2016-07-27 11:32:05

标签: arrays string vba

我的文本文件中的一行采用以下格式:

字段长度:值

示例:

“的 006 :170000,的 004 :0002,的 009 :000358827,的 009 :003628325, 005 :71001,的 002 :71,的 004 :0000,的 000 :,的 005 : 95.16, 010 :1000000.00“......(长度可以更长)

*该值也可以有逗号

我目前正在以这样的方式导出这些数据:在循环内我检索第一个值,之后我将此值分配给预定义的临时数组。重复此过程(字符串解析),直到我到达字符串的末尾。但我觉得这对大文件来说很慢。通过将字符串解析为我的数组,可以更快速地分配我得到的值吗?

2 个答案:

答案 0 :(得分:0)

示例字符串000:,中有一个空值。

您可以用冒号分割值,然后修剪数组中每个元素的最后4个字符。我清空了数组中的第一个元素,因为它包含一个键而不是一个值。

Sub ArrayUsingSplit()
   Const StringValues = "006:170000,004:0002,009:000358827,009:003628325,005:71001,002:71,004:0000,000:,005:95.16,010:1000000.00"
   Dim arrValues
   Dim x As Long

   arrValues = Split(StringValues, ":")

   arrValues(0) = ""

   For x = 1 To UBound(arrValues)
        arrValues(x) = Left(arrValues(x), Len(arrValues(x)) - 4)
   Next

   Debug.Print Join(arrValues, "~")
End Sub

这是你在做什么的?

Sub ArrayUsingMid()
    Const StringValues = "006:170000,004:0002,009:000358827,009:003628325,005:71001,002:71,004:0000,000:,005:95.16,010:1000000.00"
    Dim i As Long, iStart As Integer, iEnd As Integer, iLength

    Dim arrValues()

    iEnd = 1

    Do
        ReDim Preserve arrValues(i)

        iStart = InStr(iEnd, StringValues, ":") + 1
        iEnd = InStr(iStart, StringValues, ":")
        iLength = iEnd - iStart - 4

        If iEnd > 0 Then
            arrValues(i) = Mid(StringValues, iStart, iLength)
        Else
            arrValues(i) = Mid(StringValues, iStart)
        End If

        i = i + 1
    Loop Until iEnd = 0


    Debug.Print Join(arrValues, "~")

End Sub

答案 1 :(得分:0)

Evaluate可能会缩短一点。例如,a = [{001,0;005,01.23}]将生成值为( 1, 0 ) , ( 5 , 1.23 )的二维数组。代码可以是

s = "006:170000,004:0002,009:000358827,009:003628325,005:71001,002:71,004:0000,000:"

s = Replace(s, ",", ";")
s = Replace(s, ":", ",0") ' ",0 because Evaluate doesn't allow blank values like "{1,}"

a = Evaluate("{" & s & "}")     ' ( 6, 170000 ), ( 4, 2 ), ( 9, 358827 ), ...

如果要保留前导零,可以将它们保留为字符串:

s = "006:170000,004:0002,009:000358827,009:003628325,005:71001,002:71,004:0000,000:"

s = Replace(s, ",", """;""")
s = Replace(s, ":", """,""")
s = "{""" & s & """}"

a = Evaluate(s)       ' ( "006", "170000" ), ( "004", "0002" ), ...