|
|
|
| Задача (условно):
есть 2 таблицы в каждой по тестовому одному полю.
[исправлено]
Нужно добавить в таблицу2 новые уникальные записи изтаблицы1. т.е. те токотые есть в таблице1, но нет в таблице2 [/исправлено]
записи в таблице1 могут дублироваться (но добавить нужно только уникальные)
...
чуть не забыл... значения в полях Case зависимые
т.е.
A2a <> a2a
Пока идея такая:
создать поле содержащее коды символов составляющих строку и по нему сравнивать.
Поскольку данные будут только Engl символьные надеюсь обойтись ASC
(какое будет поле вычисляемое в запросе или реальное в таблицах пока не решил, наверное все же реальное, записей очень много и задача регулярная, но это пока не суть)
Пока нужны ИДЕИ!!! | |
|
| |
|
|
|
|
Нужно добавить в таблицу2 записи отсутствующие в таблице1
|
Получается в Таблице2 мы просто дублируем записи??? или В таблицу3 | |
|
| |
|
|
|
| неправильно выразился
нужно добавить в таблицу2 записи которые есть в таблице1, но нет в таблице2
т.е. из таблицы1 в таблицу2 отсутствующие в таблице2 записи
в таблице1 записи могут дублироваться, в таблице2 - нет
пример:
таблица 1:
таблица 2:
должно получиться в Таблице 2
| |
|
| |
|
|
|
| Грубо говоря создание Справочника наименований наоборот - есть список поступлений, и добавляем новае наименования из списка.
В чем проблема?
есть функция LEFT JOIN.
и при добавление записи в Табл1 и вносить ее в Табл2 типа "Отсутствие в списке". | |
|
| |
|
|
|
| проблема в
"Case зависимости"
т.е.
A2a <> a2a | |
|
| |
|
|
|
| Че значит Case зависимость?
есть - Asc() и сравнивай коды символов. Напиши рекурсию.
И вообще есть ли смысл в A2a <> a2a, т.к. один напишет "Хлеб" другой "ХЛеб" и будет 2 "хлеба" хотя по логике он один. | |
|
| |
|
|
|
| для этой программы
Хлеб и ХЛеб и хлеб - это все разные слова несущие разную смысловую нагрузку
Идея про Asc() уже пришла , я ее в своем вопросе описал...
хотелось бы решить задачу запросами, т.к. объемы в районе 300 000 записей в таблице2 (в нее добавляем), а таблица1 (каждый раз новая) по 30-50 тыс. записей.
В принципе идея с кодами символов вполне устраивает, т.е. строки из таблицы один все равно предварительно обрабатываются посимвольно, т.е. создать еще одно поле и гнать туда коды - не проблема, но хочется чего-то "красивого" | |
|
| |
|
|
|
| Это значит свою функцию-запрос надо ...
- записи без подчинённых - Да??? | |
|
| |
|
|
|
|
| У мну красиво не получится
У мну куралесово получится | |
|
| |
|
|
|
| если простое сравнение + сумма Asc-ки кодов символов - получится не плохо.
Запрос
SELECT Таблица3.Код, Таблица3.g1
FROM Таблица3 LEFT JOIN Запрос12 ON Таблица3.Код = Запрос12.Код
WHERE (((Запрос12.g1) Is Null));
|
Запрос12---
SELECT Таблица3.g1, opo([g1])-opo([g2]) AS Выражение1, Таблица3.Код
FROM Таблица3 LEFT JOIN Таблица4 ON Таблица3.g1 = Таблица4.g2
WHERE (((opo([g1])-opo([g2]))=0));
|
где
Function opo(ParamArray Ar())
Dim k, l, m, n As Variant
Sum = 0
If Nz(Ar(0), "стоп") = "стоп" Then
Sum = 0
Else
For i = 1 To Len(Ar(0))
Sum = Sum + Asc(Mid(Ar(0), i, 1)) * i
Next
End If
opo = Sum
End Function
|
таблы
Таблица3
Код g1
1 aaa
2 aAa
3 aaA
4 ssss
Таблица4
Код g2
1 aaa
2 aAa
Запрос выдает
Код g1
3 aaA
4 ssss | |
|
| |
|
|
|
| Идея с кодами понятна, вот только я бы не стал их суммировать....
? asc("1")+asc("2")
99
? asc("c")
99
|
| |
|
| |
|
|
|
| вот для этого и есть * i - добавляется вес позиции | |
|
| |
|
|
|
| ага, был невнимателен | |
|
| |
|
|
|
| Например использовать функцию StrComp в режиме vbBinaryCompare:
INSERT INTO T2 (Поле) SELECT T1.Поле FROM T1 WHERE NOT EXISTS (SELECT * FROM T2 WHERE StrComp(T1.Поле, T2.Поле, 0)=0) | |
|
| |
|
|
|
|
| интересно, посмотрю по скорости | |
|
| |
|
|
|
| А мона пример Таблицы1, че там за данные. (я про Хлеб и Хлеб)
Интересно просто. | |
|
| |
|
|
|
| ЛеГко, на значение этих слов у меня не спрашивайте
a 1 b glycoprotein
a 1 bg
alpha 1 b glycoprotein
alpha 1 b glycoprotein
dkfzp 686 f 0970
glycoprotein alpha 1 b
hyst 2477
liver regeneration related 1
liver regeneration related i
loc 125908
loc 147680
loc 223599
loc 64024
A(2)M
a ( 2 ) mg
a 2 ( mg )
A2M
a2m
A2m
a2-m
A2-m
A2-M
a 2 maa
a 2 mac i
a 2 mac 1
a 2 macroglobulin
a 2 mg
a - 2 mg
a 2 - mg
a 2 mg _ human
alpha 1 inhibitor 3 variant i
alpha 2 m
alpha 2 macroglobulin
alpha 2 macroglobulin
cpamd 5
dkfzp 779 b 086
fwp 007
mgc 114358
mug i
mug 1
mug 2
murinoglobulin 1
murinoglobulin 2
murinoglobulin i
murinoglobulin ii
rata 2 mac i
rata 2 mac 1
s 863 7
s 863 ( 7 )
s 8637
s 863 - 7
a 2 mp
alpha 2 macroglobulin pseudogene
atrophia areata peripapillary chorioretinal degeneration
gt - iic binding protein
gtrgeo 5
loc 653546
loc 654195
|
| |
|
| |
|
|
|
| Предлагаю складывать не цифры
Function HexString(InpString As String) As String
Dim n, i As Long
HexString = ""
n = Len(InpString)
For i = 1 To Len(InpString)
HexString = HexString & Hex$(Asc(Mid$(InpString, i, 1)))
Next i
End Function
|
| |
|
| |
|
|
|
| а на ситуацию когда два символа дают туже последовательность что и Один не нарвемся? | |
|
| |
|
|
|
| Попробуй
Если Hex на любой англицкий символ выдает два,
то это из разряда фантастики | |
|
| |
|
|
|
| Мда, трудна и неказиста жизнь простого программиста.
но т.к. в конечном итоге все данные кто-то вводит ручками, то бесконтрольное добавление может давать неправильные результаты в будущем. | |
|
| |
|
|
|
| в 80% случаев данные добавляются "пакетно" из текстовых файлов "регулярной" структуры.
для остальных 20% созданы (будут созданы) формы позволяющие добавлять/изменять/удалять записи с контролем новых данных.
для выявления различного рода ошибок которые все же "проскочили" контроль, будут созданы процедуры выявления ошибок в существующих данных. | |
|
| |
|
|
|
|
| "Челу который будет осуществлять этот контроль проще застрелится."
он уже сейчас это делает, без всех этих инструментов | |
|
| |
|
|
|
| Если не предусмотреть изменение Поля в месте где оно формируется двойники будут постоянно, т.е. опять пришли к Справочнику. | |
|
| |
|
|
|
| двойники будут отсекаться в момент добавления данных их таблицы1 в таблицу2.
Данные "формируется" в интернете. Это результат работы поисковика по определенным критериям т.е. Html с разных страниц интернета, которые потом парсятся и на выходе получается некий текстовый файл, более или менее структурированный.
Этот файл дается на вход программе которую сейчас и вояю, весь контроль должен быть в этой программе.
добавление в общем-то и происходит в справочник.
Задачу я представил очень упрощенно, на самом деле полей конечно не одно, и добавление будет происходит не по одному полю, на самом деле в зависимости от данных в других полях, для каких-то строк данные не будут Case зависимыми, для каких-то условий возможны дубли, для каких-то "фраза" должна состоять из слов из другого справочника... в общем там все не просто , но жутко интересно | |
|
| |
|
|
|
| Может есть смысл сделать таблицу Аналоги, чтоб не напарываться на двойников и не давать разростаться Таблице. | |
|
| |
|
|
|
| это и есть таблица аналогий
так и называется tblAliases | |
|
| |
|
|
|
| А где данные будут храниться, в родных табличках MDB или на сервере? | |
|
| |
|
|
|
| Пока в MDB
слишком многое выясняется в процессе...
Например с уникальностью полей так до конца и не разобрались
то "поле VAL уникально ВЕЗДЕ", а начинаем смотреть то что сделал "поле VAL уникально, но может повторяться если набор организмов разный" в общем... пока MDB, точнее ACCDB | |
|
| |
|
|
|
| ОК. У меня пока джет не справляется с моими идеями по этой теме. | |
|
| |
|
|
|
| придется написать свой движок | |
|
| |
|
|
|
| Неее. Проще научиться играть по его правилам.
Я так понимаю, что уникальным индексом по одному полю в данном случае отделаться не получиться?
Это я к тому, что может сделать поле с регистрозависимым индексом? | |
|
| |
|
|
|
| не не получится | |
|
| |
|
|
|
| Хорошо, а составной регистрозависимый индекс нам не поможет? | |
|
| |
|
|
|
| а это как ?
хотя боюсь что нет... слишком много условий завязанных на другие справочники
т.е. например есть некий многозначный атрибут объекта (т.е. это не поле а таблица связанная с объектом) , объект относится к определенному типу, тип входит в какой-то словарь, в словаре указано могут ли быть повторы значения атрибута объекта внутри данного словаря. если можно, то в объектах относящимся к одному словарю могут быть повторы (но не в одном объекте), а вот если нельзя, то этот атрибут объекта уникален во всем словаре
В общем Ж...
так что ты там говорил про регистрозависимый индекс? Как он создается ? | |
|
| |
|
|
|
|
| Круто! Век живи, век учись, как был дураком так и останешься | |
|
| |
|
|
|
| По моему пора прекратить забивать всем голову общей задачей... Я в этой каше разбираюсь уже 5 месяцев и еще не все выяснил.
Мне нужна идея решения локальной задачи... добавления уникальных регистрозависимых записей. | |
|
| |
|
|
|
| Докладаю вариант, окончание которого удалось таки дождаться:
1. Создал таблицу tblA, натолкал 300 000 записей (поле Alias 52-84 разных символов)
2. Создал таблицу tblNew, натолкал 50 000 записей (IDItem Long, Alias 52-84 разных символов), из них 25 000 записей cо значением Alias, идентичным значениям в таблице tblA.
3. Создал таблицу tblTemp (IdItem Long, Alias varBinary 510). Задал уникальный индекс по полю Alias.
4. Запросом (запуск вручную) добавил записи из tblA в tblTemp (только поле Alias) - 4 мин 45 сек.
5. Запросом (запуск вручную) добавил записи из tblNew в tblTemp (IDItem, Alias) - 0 мин 23 сек.
Получил отказ на 25 000 записей (что радует)
6. Запросом (запуск вручную) добавил записи из tblTemp в tblA (Alias), где IDItem Is Not Null - 0 мин 05 сек. (Новые 25 000 записей)
7. Запросом (запуск вручную) удалил все записи из tblTemp. Очень быстро. | |
|
| |
|
|
|
| Спасибо.
Про индекс очень хорошо подумаю... видимо где-то можно будет применить. | |
|
| |
|
|
|
| Исчо мутная идея:
Хранить "маски регистров" буковок, преобразованные в Long:
Если мы имеем строку до 31 символа (увы): "Однажды В Втуденую Зимнюю Пору"
Мы можем получить ее маску регистров:___100000001010000000010000001000
и преобразовать ее в Long:______________1613235208
В итоге, мы храним значительно меньше лишнего, всего 4 байта на строку, и имеем возможность сравнивать строки с учетом регистра.
На скорость не проверял. | |
|
| |
|
|
|
| вот именно чего-то подобного я и ждал когда начинал этот топик!!!!
Именно идей!!! А уж проверить, прикрутить, попробовать - я сам :-)
спасибо! | |
|
| |
|
|
|
|
А нам то тоже-ж интересно. | |
|
| |
|
|
|
| Тут еще народ насоветовал.
"Зиповать" строки сравнивать зипованное значение | |
|
| |
|
|
|
| Закрывая тему.
Нашел на sql.ru несколько обсуждений на данную тему.
Пока рассматриваю 3 варианта
1-й
Суммирование кодов символов с учетом веса положения символа в строке (спасибо kot_k_k)
и сравнение/группировка по этому полю
2-й
Вычисление строки определяющей положение больший и маленьких символов в строке
типа:
OsMOr = 10110
и сравнение/группировка по 2-м полям
3-й
использование дополнительного поля binary с тем же значением что и текстовое и его использовать для сравнения/группировки
StrComp - пока никак не придумаю как его прикрутить к группировке (для Join подходит идеально)
Что буду использовать пока не решил, нужно покрутить в голове все +/- (дело не только в скорости)
Вот в дополнение ссылка от MS
http://support.microsoft.com/kb/244693
Всем большое спасибо! | |
|
| |
|
|
|
|
Вычисление строки ... OsMOr = 10110
А чего в Long не перевести, медленно?
| |
|
| |
|
|
|
| в смысле строку "10110" в число? | |
|
| |
|
|
|
| Не, исходную строку сразу в Long (при длине Max 31 символ) через маску регистров.
Например:
"osmor"=0
"Osmor"=1
"OSmor"=3
"OsMOr"=13
"OSMOROSMOROSMOROSMOROSMOROSMORO"=2147483647
И даже то, что
"osmorosmorosmor"=0
не должно помешать по-моему, так так задействованы два поля, основное и маска.
Хотя суммирование кодов символов пожалуй побыстрее будет и однозначнее.
Добавлено:
Однозначнее, да не очень, потому как:
?opo("AA")-аглицкие А
195
?opo("Г") - русская Г
195
?opo("FA")
200
?opo("И")
200
Или например на чистом аглицком:
?opo("ABC")
398
?opo("DBB")
398
Для opo=561 насчитал 781 буквосочетание (из трех аглицких букв обоих регистров и пробела).
Из возможных 53*53*53=148877 вариантов буквосочетаний не повторились только 46 значений opo.
Я так понимаю, что сравнение/группировка по одному этому полю (вариант 1), тоже не получится. | |
|
| |
|
|
|
| Там было умножение на ВЕС позиции!
For i = 1 To Len(Ar(0))
Sum = Sum + Asc(Mid(Ar(0), i, 1)) * i
Next
|
| |
|
| |
|
|
|
| Я видел, но если-бы строку можно было однозначно преобразовать к Long, никто-бы строки не хранил по 2 байта на символ.
Проверь хотя бы то, что я привел. Считал твоей функцией.
Как маску регистров использовать можно, как однозначный идентификатор для сортировки, сравнения и группировки - нет. | |
|
| |
|
|
|
| Функция ведь написана для проверки РАВНЫХ (для бахнутого Аксеса) строк!!!
Она работает в Запросе, где поля равны друг другу и Задает ПОЛОНУЮ строгость отношения РАВНО (каламбур).
FROM Таблица3 LEFT JOIN Таблица4 ON Таблица3.g1 = Таблица4.g2
WHERE (((opo([g1])-opo([g2]))=0));
|
| |
|
| |
|
|
|
| Ну да, то есть она и работает как маска регистров. (Дополнительный параметр идентификации).
Вот если - бы функция возвращала уникальное значение для каждой строки, например как эта:
Public Function funASCIndexHex(strInput As String) As String
Dim i As Long
funASCIndexHex = String(Len(strInput) * 2, " ")
For i = 1 To Len(strInput)
Mid$(funASCIndexHex, i * 2 - 1, 2) = Hex(Asc(Mid$(strInput, i, 1)))
Next i
End Function
|
тогда одно поле с ее значением можно было-бы использовать для объединения, группировки, сравнения и т.д. | |
|
| |
|
|
|
| Да тут полностью согласен, ведь писал "в лоб". | |
|
| |
|
|
|
| Да нормальный для маски алгоритм. Быстрее чем предложенный мной.
В моем алгоритме есть один теоретический малопригодный нюанс.
Можно хранить одно значение буквосочетаний в нижнем регистре и несколько масок регистров и,
при необходимости, восстанавливать по маске регистров значение буквосочетания с учетом регистра.
Но работать будет жуть как медленно. | |
|
| |
|
|
|
| Специально для kot_k_k
И если есть железная уверенность, что первые 16 символов никто не введет
можно суммировать Нех от символа
HexString= = 10
HexString= = 11
HexString= = 12
HexString= = 13
HexString= = 14
HexString= = 15
HexString= = 16
HexString= = 17
HexString= = 18
HexString= = 19
HexString= = 1A
HexString= = 1B
HexString= = 1C
HexString= = 1D
HexString= = 1E
HexString= = 1F
HexString= = 20
HexString=! = 21
HexString=" = 22
HexString=# = 23
HexString=$ = 24
HexString=% = 25
HexString=& = 26
HexString=' = 27
HexString=( = 28
HexString=) = 29
HexString=* = 2A
HexString=+ = 2B
HexString=, = 2C
HexString=- = 2D
HexString=. = 2E
HexString=/ = 2F
HexString=0 = 30
HexString=1 = 31
HexString=2 = 32
HexString=3 = 33
HexString=4 = 34
HexString=5 = 35
HexString=6 = 36
HexString=7 = 37
HexString=8 = 38
HexString=9 = 39
HexString=: = 3A
HexString=; = 3B
HexString=< = 3C
HexString== = 3D
HexString=> = 3E
HexString=? = 3F
HexString=@ = 40
HexString=A = 41
HexString=B = 42
HexString=C = 43
HexString=D = 44
HexString=E = 45
HexString=F = 46
HexString=G = 47
HexString=H = 48
HexString=I = 49
HexString=J = 4A
HexString=K = 4B
HexString=L = 4C
HexString=M = 4D
HexString=N = 4E
HexString=O = 4F
HexString=P = 50
HexString=Q = 51
HexString=R = 52
HexString=S = 53
HexString=T = 54
HexString=U = 55
HexString=V = 56
HexString=W = 57
HexString=X = 58
HexString=Y = 59
HexString=Z = 5A
HexString=[ = 5B
HexString=\ = 5C
HexString=] = 5D
HexString=^ = 5E
HexString=_ = 5F
HexString=' = 60
HexString=a = 61
HexString=b = 62
HexString=c = 63
HexString=d = 64
HexString=e = 65
HexString=f = 66
HexString=g = 67
HexString=h = 68
HexString=i = 69
HexString=j = 6A
HexString=k = 6B
HexString=l = 6C
HexString=m = 6D
HexString=n = 6E
HexString=o = 6F
HexString=p = 70
HexString=q = 71
HexString=r = 72
HexString=s = 73
HexString=t = 74
HexString=u = 75
HexString=v = 76
HexString=w = 77
HexString=x = 78
HexString=y = 79
HexString=z = 7A
HexString={ = 7B
HexString=| = 7C
HexString=} = 7D
HexString=~ = 7E
HexString= = 7F
HexString=? = 80
HexString=? = 81
HexString=‚ = 82
HexString=? = 83
HexString=„ = 84
HexString=… = 85
HexString=† = 86
HexString=‡ = 87
HexString=? = 88
HexString=‰ = 89
HexString=S = 8A
HexString=‹ = 8B
HexString=? = 8C
HexString=? = 8D
HexString=Z = 8E
HexString=? = 8F
HexString=? = 90
HexString=‘ = 91
HexString=’ = 92
HexString=“ = 93
HexString=” = 94
HexString=• = 95
HexString=– = 96
HexString=— = 97
HexString=? = 98
HexString=™ = 99
HexString=s = 9A
HexString=› = 9B
HexString=? = 9C
HexString=? = 9D
HexString=z = 9E
HexString=Y = 9F
HexString= = A0
HexString=? = A1
HexString=? = A2
HexString=? = A3
HexString=¤ = A4
HexString=? = A5
HexString=¦ = A6
HexString=§ = A7
HexString=? = A8
HexString=© = A9
HexString=? = AA
HexString=« = AB
HexString=¬ = AC
HexString= = AD
HexString=® = AE
HexString=? = AF
HexString=° = B0
HexString=± = B1
HexString=? = B2
HexString=? = B3
HexString=? = B4
HexString=µ = B5
HexString=¶ = B6
HexString=· = B7
HexString=? = B8
HexString=9 = 39
HexString=: = 3A
HexString=; = 3B
HexString=< = 3C
HexString== = 3D
HexString=> = 3E
HexString=? = 3F
HexString=@ = 40
HexString=A = 41
HexString=B = 42
HexString=C = 43
HexString=D = 44
HexString=E = 45
HexString=F = 46
HexString=G = 47
HexString=H = 48
HexString=I = 49
HexString=J = 4A
HexString=K = 4B
HexString=L = 4C
HexString=M = 4D
HexString=N = 4E
HexString=O = 4F
HexString=P = 50
HexString=Q = 51
HexString=R = 52
HexString=S = 53
HexString=T = 54
HexString=U = 55
HexString=V = 56
HexString=W = 57
HexString=X = 58
HexString=Y = 59
HexString=Z = 5A
HexString=[ = 5B
HexString=\ = 5C
HexString=] = 5D
HexString=^ = 5E
HexString=_ = 5F
HexString=' = 60
HexString=a = 61
HexString=b = 62
HexString=c = 63
HexString=d = 64
HexString=e = 65
HexString=f = 66
HexString=g = 67
HexString=h = 68
HexString=i = 69
HexString=j = 6A
HexString=k = 6B
HexString=l = 6C
HexString=m = 6D
HexString=n = 6E
HexString=o = 6F
HexString=p = 70
HexString=q = 71
HexString=r = 72
HexString=s = 73
HexString=t = 74
HexString=u = 75
HexString=v = 76
HexString=w = 77
HexString=x = 78
HexString=y = 79
HexString=z = 7A
HexString={ = 7B
HexString=| = 7C
HexString=} = 7D
HexString=~ = 7E
HexString= = 7F
HexString=Ђ = 80
HexString=Ѓ = 81
HexString=‚ = 82
HexString=ѓ = 83
HexString=„ = 84
HexString=… = 85
HexString=† = 86
HexString=‡ = 87
HexString=? = 88
HexString=‰ = 89
HexString=Љ = 8A
HexString=‹ = 8B
HexString=Њ = 8C
HexString=Ќ = 8D
HexString=Ћ = 8E
HexString=Џ = 8F
HexString=ђ = 90
HexString=‘ = 91
HexString=’ = 92
HexString=“ = 93
HexString=” = 94
HexString=• = 95
HexString=– = 96
HexString=— = 97
HexString=˜ = 98
HexString=™ = 99
HexString=љ = 9A
HexString=› = 9B
HexString=њ = 9C
HexString=ќ = 9D
HexString=ћ = 9E
HexString=џ = 9F
HexString= = A0
HexString=Ў = A1
HexString=ў = A2
HexString=Ј = A3
HexString=¤ = A4
HexString=Ґ = A5
HexString=¦ = A6
HexString=§ = A7
HexString=Ё = A8
HexString=© = A9
HexString=Є = AA
HexString=« = AB
HexString=¬ = AC
HexString= = AD
HexString=® = AE
HexString=Ї = AF
HexString=° = B0
HexString=± = B1
HexString=І = B2
HexString=і = B3
HexString=ґ = B4
HexString=µ = B5
HexString=¶ = B6
HexString=· = B7
HexString=ё = B8
HexString=№ = B9
HexString=є = BA
HexString=» = BB
HexString=ј = BC
HexString=Ѕ = BD
HexString=ѕ = BE
HexString=ї = BF
HexString=А = C0
HexString=Б = C1
HexString=В = C2
HexString=Г = C3
HexString=Д = C4
HexString=Е = C5
HexString=Ж = C6
HexString=З = C7
HexString=И = C8
HexString=Й = C9
HexString=К = CA
HexString=Л = CB
HexString=М = CC
HexString=Н = CD
HexString=О = CE
HexString=П = CF
HexString=Р = D0
HexString=С = D1
HexString=Т = D2
HexString=У = D3
HexString=Ф = D4
HexString=Х = D5
HexString=Ц = D6
HexString=Ч = D7
HexString=Ш = D8
HexString=Щ = D9
HexString=Ъ = DA
HexString=Ы = DB
HexString=Ь = DC
HexString=Э = DD
HexString=Ю = DE
HexString=Я = DF
HexString=а = E0
HexString=б = E1
HexString=в = E2
HexString=г = E3
HexString=д = E4
HexString=е = E5
HexString=ж = E6
HexString=з = E7
HexString=и = E8
HexString=й = E9
HexString=к = EA
HexString=л = EB
HexString=м = EC
HexString=н = ED
HexString=о = EE
HexString=п = EF
HexString=р = F0
HexString=с = F1
HexString=т = F2
HexString=у = F3
HexString=ф = F4
HexString=х = F5
HexString=ц = F6
HexString=ч = F7
HexString=ш = F8
HexString=щ = F9
HexString=ъ = FA
HexString=ы = FB
HexString=ь = FC
HexString=э = FD
HexString=ю = FE
HexString=я = FF
|
| |
|
| |
|
|
|
|
| Ликбез для Кота | |
|
| |
|
|
|
|
| ну вот некоторое резюме.
Самый быстрый это конечно BINARY, но при этом база вырастает 2 в раза
расчет битовой маски "на лету", очень медленно
Добавление текстового поля с битовой маской дает увеличение размера бд примерно на 10%
Учитывая что значения этих полей у меня один фиг до этого формируются из других полей посимвольной обработкой (той про которую я прошлый раз спрашивал http://hiprog.com/forum/read.php?id_forum=1&id_theme=5477&page=6), то решил использовать битовую маску
Вот примерно функция
Public Function CaseToBin(strParam As String) As Variant
Dim U() As Byte
Dim L() As Byte
Dim i As Integer
Const ZERO As String = "0"
Const ONE As String = "1"
CaseToBin = String(Len(strParam), ZERO)
Dim intStep As Integer
intStep = LenB("A")
U() = UCase(strParam)
L() = strParam
For i = 0 To UBound(U) Step intStep
If U(i) = L(i) Then Mid$(CaseToBin, i / intStep + 1, 1) = ONE
Next
End Function
|
А вот время ее работы с апдейтом через рекордсет 34 тыс записей (10 проходов)
CaseToBin 1 - 4085 ms
CaseToBin 2 - 3756 ms
CaseToBin 3 - 2974 ms
CaseToBin 4 - 3415 ms
CaseToBin 5 - 3715 ms
CaseToBin 6 - 4867 ms
CaseToBin 7 - 2454 ms
CaseToBin 8 - 3625 ms
CaseToBin 9 - 5748 ms
CaseToBin 10 - 4537 ms
Сумма - 39 186 ms | |
|
| |
|
|
|
| Я все-таки не могу понять, почему ты отказываешься маску конвертировать в лонг?
Чуть медленнее бы формировалось значение маски, но
занимало бы значительно меньше места на диске, возможно быстрее бы работало в запросах.
Или есть что-то, о чем я не догадываюсь?
Ведь при:
?CaseToBin("Однажды в студеную зимнюю пору")
100000010100000000100000010000
Приходится хранить два размера исходной строки (оригинал и маска). | |
|
| |
|
|
|
| ну у меня символов до 255 (встречаются и длиннее, но заказчик согласился при загрузке такие отмечать и выдавать для контроля оператору)
в среднем в существующих данных длинна строки колеблется от 1 до 138 символов, наиболее часто от 25 до 56
Как в Long загнать? | |
|
| |
|
|
|
| Currency, Decimal не подойдут?
Добавлено:
Отвечу сам себе: пожалуй нет. | |
|
| |
|
|
|
| Вот ведь мастер функцию нарисовал, даже и не разогнать.
Разве что Variant на String поменять в объявлении функции, и то всего 8% прибыли.
Даже не интересно. | |
|
| |
|
|
|
| Ну тут я старался... боролся за скорость...
кстати... ХЗ почему я Variant написал... надо попытаться вспомнить... были же какие-то мысли, наверное | |
|
| |
|
|
|
| Можно выиграть еще несколько процентов, если во входных строках присутствуют не буквенные символы:
Public Function CaseToBin2(strParam As String) As String
Dim N() As Byte
Dim L() As Byte
Dim i As Integer
Const ZERO As String = "0"
Const ONE As String = "1"
CaseToBin2 = String(Len(strParam), ZERO)
Dim intStep As Integer
intStep = LenB("A")
L() = LCase(strParam)
N() = strParam
For i = 0 To UBound(L) Step intStep
If L(i) > N(i) Then Mid$(CaseToBin2, i / intStep + 1, 1) = ONE
Next
End Function
|
Тогда нет необходимости лишний раз MID$-итировать:
?CaseToBin("OsMoR 123 ()")
101011111111
?CaseToBin2("OsMoR 123 ()")
101010000000
На показанном ранее в качестве образца наборе строк выигрыш составил 16%. | |
|
| |
|
|
|
| Во.. так лучше, я как раз думал как бы выкинуть те строки которые заведомо состоят из одних цифирь | |
|
| |
|
|
|
| Может не только цифирьки а весь Non&LowerCase?:
Public Function CaseToBin2(strParam As String) As String
Dim N() As Byte
Dim L() As Byte
Dim i As Integer
Const ZERO As String = "0"
Const ONE As String = "1"
If StrComp(LCase(strParam), strParam, vbBinaryCompare) = 0 Then Exit Function
L() = LCase(strParam)
N() = strParam
CaseToBin2 = String(Len(strParam), ZERO)
Dim intStep As Integer
intStep = LenB("A")
For i = 0 To UBound(L) Step intStep
If L(i) > N(i) Then Mid$(CaseToBin2, i / intStep + 1, 1) = ONE
Next
End Function
|
На 74% быстрее на образцах данных + экономия на диске. | |
|
| |
|
|
|
| ага, только для меня нужно
If StrComp(LCase(strParam), strParam, vbBinaryCompare) = 0 Then CaseToBin2 = ZERO : Exit Function | |
|
| |
|
|
|
| Мне еще вот эти варианты не нравятся:
?CaseToBin2("atrophia areata peripapillary chorioretinal degeneration A")
00000000000000000000000000000000000 00000000000000000000001
Вроде как лидирующие 0 тут не играют рояля?
Может немножко пожертвовать скоростью с целью экономии места на диске? | |
|
| |
|
|
|
| думаю можно... строки все же довольно длинные, а + 5-10 секунд погоды не сделают... есть операции которые до 2-х минут длятся
(но их я потом оптимизировать буду, когда "в принципе" заработает) | |
|
| |
|
|
|
|
| Наткнулся на задачу в поисках решения своих проблем
Не все понял из разговора
Нужны именно коды? Чисто академический интерес?
Если нет, то почему не свалить все на Access? На запросы
Если нужна таблица, то тем же путем , ток данные из запроса забирать
Изв, ес не по делу вмешался - нуб я)
Удачи) | |
|
| |
|
|
|
| задача стоит (стояла) сравнивать текстовые поля с учетом регистра. Здесь пообсуждали несколько вариантов. | |
|
| |
|
|
|
| Создаем запрос по табл1, в конструкторе уст сортировку, там же в свойствах запроса - уникальность значений
Результат - запрос полностью соотвтств требованиям к табл2 | |
|
| |
|
|
|
| непонял. JET при работе с текстовыми полями не различает размер букв, т.е. для него "A" и "a" одинаковы
мне же нужно что бы при сравнении это были разными значениями
т.е.
"Арбуз" <> "АРбуз" <> "арбуз" <> "арбуЗ"
т.е. если в таблице1 есть
"Арбуз"
"АРбуз"
"арбуз"
"арбуЗ"
то все они должны попасть в таблицу2 | |
|
| |
|
|
|
| Т.е те данные, что содер в твоей табл1 в табл Access в принципе хранить невозможно? Пропадает Case зависимость? | |
|
| |
|
|
|
| почему? где же я их сейчас храню? если нет никаких ограничений или индексов, ничего не мешает внести в таблицу одинаковые данные
сам ACCESS хранит то что ему дали, и в том виде в каком дали.
Дали "АрБуЗ", так и будет сохранять. | |
|
| |
|
|
|
| каждый символ в винде имеет определенное представление в таблице знакогенератора
соответственно, надо сравнивать эти таблицы %) | |
|
| |
|
|
|
|
| ([рогАнь] ага | |
|
| |
|
|
|
| Спасибо, понял
Извините за мелочи для вас, пообщаться не с кем в своем соку варюсь | |
|
| |
|
|
|
| Меня зацепило просто :)
Уже чисто спортивный азарт
Не знаю на твоей базе как будет по скорости при таких количествах
Идея следующая
Создаю в табл еще текстовое поле и туда при вводе загоняется строка той же длины
На месте прописных - 1, строчных - 0
... и далее - как я излагал, запрос и т.д.
База вдвое правда вырастает :(
У меня прошло | |
|
| |
|
|
|
|
Прочитайте все обсуждение.
Этот вариант уже был предложен выше, более того к нему написана функция (даже не одна) и он уже реализован в рабочей базе
База вырастет не в 2 раза, а несколько меньше, если убирать ведущие "0", см. функции предложенные выше | |
|
| |
|
|
|
|
| "Шарик, ты балбес". Это я про себя.
Все пытался маску регистров в Long преобразовать, а можно иначе "поджаться".
Преобразовывать группы разрядов маски по 4 знака к Hex-у.
В итоге, можно поджаться еще до 4 крат.
В принципе, можно и до 6 крат (если перегонять в 64-значное представление), но, наверное, более затратно.
ps. Хорошая мысля приходит опосля. | |
|
| |