Страницы: 1
RSS
парсинг текстовой строки поиском совпадения с заданным перечнем значений, парсинг текстовой строки поиском совпадения с заданным перечнем значений
 
День добрый!
Есть ИСХОДНЫЙ стобец вида:
 MAZDA Demio DW3W 00- , KIA AVELLA 94- LOW R
 NISSAN PRIMERA P10 LH
 HONDA ACCORD, VIGOR 85-

Есть столбец с Марками вида:
 MAZDA
 NISSAN
 HONDA

Есть столбец с Моделями вида:
 Demio
 PRIMERA
 ACCORD

Регистр не важен. Нужно используя столбцы с марками и моделями распарсить исходный столбец, т.е. определить какая в текстовой строке указана марка и модель.
В общем случае формат строки может быть произвольным, марка может быть не первым словом либо её может вовсе не быть.

Понятно что можно в цикле для каждой строки проверять совпадения сначала с маркой, затем с моделью, но такое решение занимает слишком много времени. Более 20 минут, т.к. строк более 40000.

Подскажите есть ли более красивое решение через макрос или формулу?
Спасибо!
 
novac, нужен файл-пример. Если есть таблица соответствия Модель-Марка, то достаточно искать Модель, а марку подставлять из таблицы.

PS Хотя да, бывают одинаковые названия моделей у разных марок. Семерка ВАЗ и семерка БМВ например :)
Изменено: Казанский - 22.02.2018 08:57:28
 
Соответствия нет. Только два списка. Пример сейчас отправлю
 
В примере нужно заполнить первые два столбца первого листа (то что зеленым шрифтом)
 
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub MarkaModel()
Dim arrMr(), arrMd(), arrStr(), arrNew()
Dim dicMr As Object, dicMd As Object
Dim iTemp, I&, J&, N&
On Error Resume Next
With Worksheets("марка")
    arrMr = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
End With
With Worksheets("модель")
    arrMd = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
End With
Set dicMr = CreateObject("Scripting.Dictionary"): dicMr.CompareMode = 1
Set dicMd = CreateObject("Scripting.Dictionary"): dicMd.CompareMode = 1
N = IIf(UBound(arrMr) >= UBound(arrMd), UBound(arrMr), UBound(arrMd))
For I = 1 To N
    iTemp = dicMr(CStr(arrMr(I, 1)))
    iTemp = dicMd(CStr(arrMd(I, 1)))
Next
With Worksheets("sample")
    arrStr = .Range("C2:C" & .Cells(.Rows.Count, 3).End(xlUp).Row).Value
    ReDim arrNew(1 To UBound(arrStr), 1 To 2)
    For I = 1 To UBound(arrStr)
        For J = 0 To N - 1
            If arrStr(I, 1) Like "*" & dicMr.Keys()(J) & "*" Then arrNew(I, 1) = dicMr.Keys()(J)
            If arrStr(I, 1) Like "*" & dicMd.Keys()(J) & "*" Then arrNew(I, 2) = dicMd.Keys()(J)
        Next
    Next
    Application.ScreenUpdating = False
    .Range("A2").Resize(N, 2) = arrNew
End With
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Модераторам: «Поиск значений из списка в ячейке»
Изменено: Jack Famous - 22.02.2018 11:47:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, почему же неточный? По моему вполне адекватное название было...
Согласие есть продукт при полном непротивлении сторон
 
Sanja, согласен - исправил. Название какое-то длинное (искать непросто), да и "парсинг" не все знают. Лично у меня "парсинг" неотрывно ассоциируется с сайтами. Тут же всё-таки, скорее проверка по списку. На суд модераторов))
Изменено: Jack Famous - 22.02.2018 11:54:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Читают тему
Loading...