VBA: разбить многострочную строку на список с помощью словарей - PullRequest
0 голосов
/ 27 августа 2018

Привет всем,

У меня следующая проблема: у меня есть многострочная строка, и я хочу разбить ее на список со словарями.

Например, у меня есть следующая строка:

input = "Bla Bla2 Bla3" & vbLf & "Bla21 Bla22 Bla23"

И я хочу разделить его на массив, где каждая запись содержит 1 строку (т.е. первая запись - первая строка и т. Д.). Сами записи должны быть словарями, где каждый столбец (слова, разделенные "") определяется словом.

Например, здесь у нас есть "col1", "col2" и "col3".

Результатом должен быть список из 2 элементов - и каждый элемент должен быть словарем, где d («col1») содержит «Bla» для первой записи и «Bla21» для второй записи.

Мне удалось разбить строку и передать, например, первый столбец в окончательный массив, разделив входные данные

    ar = Split(input,vbLf,,vbTextCompare)
    pos = 0

А затем перебирать этот массив - динамически добавлять записи в массив результатов.

    Do while pos < UBound(ar)
       line = Split(ar(pos))
       if Len(Join(result)) = 0 Then
           ReDim Preserve result(0)
       else
           ReDim Preserve result(Ubound(result)+1)
       result(Ubound(result)) = line(0)
       pos = pos + 1
   Loop

Теперь - моя проблема заключается в обобщении этого для всех столбцов, т. Е. Интеграции словаря в это.

Я добавил инициализацию нового словаря ниже "line = Split ...)" следующим образом

 Set d = New dictionary

И установить значения непосредственно под предложением if

 d("col1") = line(0)
 d("col2") = line(1)
 d("col3") = line(2)

И, наконец, я хочу установить элемент массива равным этому словарю:

result(Ubound(result)) = d

Однако это не работает. При его запуске я получаю сообщение об ошибке «Аргумент не обязателен». При добавлении набора, т. Е .:

Set result(Ubound(result)) = d

Я получаю ошибку "Требуется объект".

Может кто-нибудь помочь мне исправить эту ошибку?

Спасибо и всего наилучшего.

/ edit: чтобы упростить жизнь, вот актуальная функция, которую я сейчас использую:

Function IterateString(text as String)
      Dim pos as Integer
      Dim entry() as String
      Dim line() as String
      Dim result() as String
      Dim MyDict as Scripting.Dictionary

      entry = Split(text,vbLf,,vbTextCompare)
      pos = 0
      result = Array()

      Do While pos < Ubound(entry)
        If Trim$(entry(pos)) <> "" Then
           line = Split(entry(pos))
           Set MyDict = New Scripting.Dictionary
           If Len(Join(result)) = 0 Then
              ReDim result(0,0)
           Else
              ReDim Preserve result(UBound(result,1) + 1)
           End If
           MyDict.Add "col1",line(0)
           MyDict.Add "col2",line(1)
           Set result(Ubound(result,1)) = MyDict
        End If
        pos = pos + 1
     Loop
     IterateString = result
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...