Страница: 1 |
Вопрос: Форматный контроль строки | Добавлено: 30.03.07 09:00 |
Автор вопроса: ![]() |
Задали мне с утра задачку. Нужно провести форматный контроль адресов на соответствие КЛАДРу. Проще говоря, на входе имеем строку (любую), надо посчитать сколько в ней запятых, и если их 9 (девять), то выдать True (проверку прошел), а если нет – то False.
Пока что придумалось 4 варианта, но - никак не соображу какую маску подсунуть like. - по скорости все варианты почти одинаковые. Победил вариант 3 (даже с лишним Asc), что для меня явилось полной неожиданностью. Может предложите получше, а то с утра что то башка не варит. Function AdrKLADR1(inS As String) As Boolean Dim flgY As Boolean flgY = inS Like "вот тут не соображу, какую маску написать" AdrKLADR = flgY End Function Function AdrKLADR2(inS As String) As Boolean Dim arrY() As String arrY = Split(inS, ",") If UBound(arrY) = 9 Then AdrKLADR2 = True Else AdrKLADR2 = False End If End Function Function AdrKLADR3(inS As String) As Boolean Dim i As Long Dim k As Long k = 0 For i = 1 To Len(inS) If Asc(Mid(inS, i, 1)) = 44 Then k = k + 1 End If Next i If k = 9 Then AdrKLADR3 = True Else AdrKLADR3 = False End If End Function Function AdrKLADR4(inS As String) As Boolean Dim poz1 As Long Dim k As Long poz1 = 0 k = 0 Do While Len(inS) > poz1 poz1 = InStr(poz1 + 1, inS, ",", 1) If poz1 > 0 Then k = k + 1 Else Exit Do End If Loop If k = 9 Then AdrKLADR4 = True Else AdrKLADR4 = False End If End Function |
Ответы | Всего ответов: 9 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 249094859 Вопросов: 0 Ответов: 310 |
Профиль | Цитата | #1 | Добавлено: 30.03.07 09:52 |
попробуй так:
flgY = inS Like "*,*,*,*,*,*,*,*,*,*"
|
Номер ответа: 2 Автор ответа: ![]() ![]() ICQ: 237822510 Вопросов: 28 Ответов: 1182 |
Профиль | Цитата | #2 | Добавлено: 30.03.07 10:10 |
![]() Вариант 1 - 14.04688 Вариант 1 - 16.0625 Вариант 1 - 13.5625 Вариант 1 - 14.07813 Конечно, все это величины одного порядка, и заметной скорости не ощутимо, но почему то тупой проход по строке с сравнением оказывается быстрее. |
Номер ответа: 3 Автор ответа: ![]() ![]() ICQ: 237822510 Вопросов: 28 Ответов: 1182 |
Профиль | Цитата | #3 | Добавлено: 30.03.07 10:11 |
Брр... Вариант 1 - 14.04688
Вариант 1 - 16.0625 Вариант 1 - 13.5625 Вариант 1 - 14.07813 Конечно: Вариант 1 - 14.04688 Вариант 2 - 16.0625 Вариант 3 - 13.5625 Вариант 4 - 14.07813 |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 1249088 Вопросов: 10 Ответов: 304 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 30.03.07 13:12 |
Хочешь скорости - сюда ходи:
http://www.xbeat.net/vbspeed/index.htm (inStrCount) |
Номер ответа: 5 Автор ответа: ![]() ![]() ICQ: 237822510 Вопросов: 28 Ответов: 1182 |
Профиль | Цитата | #5 | Добавлено: 30.03.07 14:32 |
Sur Спасибо. Посмотрел, хорошая ссылка. Будем тестить. |
Номер ответа: 6 Автор ответа: ![]() ![]() ICQ: 237822510 Вопросов: 28 Ответов: 1182 |
Профиль | Цитата | #6 | Добавлено: 30.03.07 14:49 |
Хм... Потестил (строка ",,,,,"![]() с InStrCount04 - 18,89 c InStrCount05 - 15,2 Уж лучше просто Вариант 1 - 14,156 ![]() |
Номер ответа: 7 Автор ответа: ![]() ![]() ICQ: 237822510 Вопросов: 28 Ответов: 1182 |
Профиль | Цитата | #7 | Добавлено: 30.03.07 15:45 |
Всем спасибо. Ни один из варинтов не превосходит другие по скорости хотя бы на порядок. Выигрышь в наносекунды, на моих объемах обработки такой инфы (>300000 подобных строк) ничего не дает (вернее дает +- 1-2 сек), но в общем проекте они теряются. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 187 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 31.03.07 16:17 |
Function AdrKLADR5(inS As String) As Boolean
Dim sByte() As Byte Dim i As Long, k As Long k = 0 ReDim sByte(Len(inS)) sByte = StrConv(inS, vbFromUnicode) For i = 0 To UBound(sByte) If sByte(i) = 44 Then k = k + 1 Next i If k = 9 Then AdrKLADR5 = True Else AdrKLADR5 = False End Function Быстрее всех за исключением AdrKLADR1 |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #9 | Добавлено: 31.03.07 20:05 |
а в чём прикол всех тестов если проект не критичен к скорости? Если иначе то Си, или асм отлично справится с задачей... |
Страница: 1 |
|