Привет всем,
У меня следующая проблема: у меня есть многострочная строка, и я хочу разбить ее на список со словарями.
Например, у меня есть следующая строка:
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