Страница: 1 |
Страница: 1 |
Вопрос: Форматный контроль строки
Добавлено: 30.03.07 09:00
Автор вопроса: AndreyMp | ICQ: 237822510
Задали мне с утра задачку. Нужно провести форматный контроль адресов на соответствие КЛАДРу. Проще говоря, на входе имеем строку (любую), надо посчитать сколько в ней запятых, и если их 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
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #1
Добавлено: 30.03.07 09:52
попробуй так:
Номер ответа: 2
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #2
Добавлено: 30.03.07 10:10
) Слона то я и не заметил, подумал *-это все символы,включая и запятую. А так вроде работает - спасибо, но на 10000 иттераций получается:
Вариант 1 - 14.04688
Вариант 1 - 16.0625
Вариант 1 - 13.5625
Вариант 1 - 14.07813
Конечно, все это величины одного порядка, и заметной скорости не ощутимо, но почему то тупой проход по строке с сравнением оказывается быстрее.
Номер ответа: 3
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #3
Добавлено: 30.03.07 10:11
Брр...
Вариант 1 - 16.0625
Вариант 1 - 13.5625
Вариант 1 - 14.07813
Конечно:
Вариант 1 - 14.04688
Вариант 2 - 16.0625
Вариант 3 - 13.5625
Вариант 4 - 14.07813
Номер ответа: 4
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #4
Добавлено: 30.03.07 13:12
Хочешь скорости - сюда ходи:
http://www.xbeat.net/vbspeed/index.htm
(inStrCount)
Номер ответа: 5
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #5
Добавлено: 30.03.07 14:32
Sur Спасибо. Посмотрел, хорошая ссылка. Будем тестить.
Номер ответа: 6
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #6
Добавлено: 30.03.07 14:49
Хм... Потестил (строка ",,,,,"
с InStrCount04 - 18,89
c InStrCount05 - 15,2
Уж лучше просто Вариант 1 - 14,156
(
Номер ответа: 7
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #7
Добавлено: 30.03.07 15:45
Всем спасибо. Ни один из варинтов не превосходит другие по скорости хотя бы на порядок. Выигрышь в наносекунды, на моих объемах обработки такой инфы (>300000 подобных строк) ничего не дает (вернее дает +- 1-2 сек), но в общем проекте они теряются.
Номер ответа: 8
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #8
Добавлено: 31.03.07 16:17
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
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 31.03.07 20:05
а в чём прикол всех тестов если проект не критичен к скорости? Если иначе то Си, или асм отлично справится с задачей...