Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#46: 2010-04-21 17:58:40 ЛС | профиль | цитата
nesco, только без шума.
Взял большой файл. Удалил из него все "
". Получилась огромная строка ~ 81 Mb . Для определения позиции взял "конечный кусок"
Результат ниже.

Штатный PosEx работает лучше всех.
Твой не нашел
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1res3.png [11.9KB] [318]
Разработчик
Ответов: 26200
Рейтинг: 2137
#47: 2010-04-21 18:13:07 ЛС | профиль | цитата
Tad писал(а):
Твой не нашел

Может, и не нашел. Это -- просто эксперимент.
А длина строки для поиска у тебя, случаем, не больше 256 байт, если больше, то возможна в этом проблема
Tad писал(а):
Штатный PosEx работает лучше всех

Вот я и не хотел его менять. Млин, мне бы такой файл для проверки. Гы, не удаляй его, попробуем сунуть ему продвинутый бинарный поиск
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#48: 2010-04-21 18:46:13 ЛС | профиль | цитата
nesco, это просто список улиц из кадастра РФ. Держу именно для таких случаев.
nesco писал(а):
случаем, не больше 256 байт
Нет. Она на скриншоте красным - около 80-ти наверное.
------------ Дoбавленo в 18.46:
Не. 103 байта
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26200
Рейтинг: 2137
#49: 2010-04-21 19:51:24 ЛС | профиль | цитата
Tad, скинь мне свою последнюю строку
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#50: 2010-04-21 20:49:24 ЛС | профиль | цитата
("Шевченко","пер","66000008000017900","624350","6615","","65448000000");

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1328
Рейтинг: 69
#51: 2010-04-21 21:03:58 ЛС | профиль | цитата
[offtop]("Шевченко","пер","66000008000017900","624350","6615","","65448000000");
похоже на kladr [/offtop]
карма: 2

0
Ответов: 5446
Рейтинг: 323
#52: 2010-04-21 21:32:11 ЛС | профиль | цитата
[offtop]
Tad писал(а):
это просто список улиц из кадастра РФ

КЛАДРъ и есть
[/offtop]
карма: 1

0
Ответов: 1328
Рейтинг: 69
#53: 2010-04-21 21:38:46 ЛС | профиль | цитата
[offtop]случайно никто не делал схемку для перегона kladr в SQLite [/offtop]
карма: 2

0
Разработчик
Ответов: 26200
Рейтинг: 2137
#54: 2010-04-21 22:11:56 ЛС | профиль | цитата
Tad писал(а):
Не. 103 байта

Твоя строка длиной всего 72 символа, откуда ты взял 103

Попробуй вот этот экземпляр, у меня ищутся нормально концевые строки, только имя файла поменяй


Add(MainForm,2953706,189,161)
{
Width=717
Height=143
}
Add(InlineCode,5889051,315,287)
{
@Hint=#11:Boyer-Moore|
WorkPoints=#5:doPos|
EventPoints=#5:onPos|
DataPoints=#3:Str|6:SubStr|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|21: onPos:THI_Event;|28: Str, Substr: THI_Event;|50: procedure doPos(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|72:function PosEx2(const SubStr, S: string; Offset: cardinal = 1): Integer;|3:var|22: Ps, lp, i : Integer;|33: BMT: array[0..255] of cardinal;|5:begin|23: lp := Length(SubStr);|1: |22: for i := 0 to 255 do|19: BMT[i] := lp; |25: for i := lp downto 1 do|36: if BMT[ord(SubStr[i])] = lp then|36: BMT[ord(SubStr[i])] := lp - i;|0:|24: Ps := Offset + lp - 1;|0:|26: while Ps <= Length(S) do|31: if SubStr[lp] <> S[Ps] then|32: Ps := Ps + BMT[ord(S[Ps])]|8: else|29: for i := lp downto 1 do|43: if SubStr[i] <> S[Ps - lp + i] then|13: begin|23: Ps := Ps + 1;|16: Break;|11: end|26: else if i = 1 then|13: begin|32: Result := Ps - lp + 1;|15: Exit;|12: end;|14: Result := 0;|4:end;|0:|28:procedure THiAsmClass.doPos;|5:begin|71: _hi_onEvent(onPos,PosEx2(ToStringEvent(SubStr),ToStringEvent(Str),5));|4:end;|0:|4:end.|
link(onPos,9916722:doText,[])
link(Str,4004521:Text,[])
link(SubStr,5209601:Var2,[])
AddHint(51,39,75,13,@Hint)
}
Add(Edit,6864257,322,231)
{
Left=5
Top=5
Width=605
Text="("Шевченко","пер","66000008000017900","624350","6615","","65448000000");"
}
Add(Button,11723835,189,203)
{
Left=285
Top=80
link(onClick,8185137:doEvent1,[])
}
Add(Edit,9916722,434,287)
{
Left=345
Top=80
Width=100
Text=""
}
Add(StrList,4004521,315,105)
{
FileName="log2.txt"
}
Add(Hub,8185137,245,203)
{
OutCount=5
link(onEvent1,4004521:doLoad,[(287,209)(287,139)])
link(onEvent2,7401949:doStart,[])
link(onEvent3,5889051:doPos,[(287,223)(287,293)])
link(onEvent4,7401949:doStop,[(347,230)(347,223)])
link(onEvent5,2668518:doLength,[(282,237)(282,363)])
}
Add(TimeCounter,7401949,434,210)
{
link(onStop,2953706:doCaption,[(481,223)(481,91)(177,91)(177,167)])
}
Add(Length,2668518,385,357)
{
link(onLength,923927:doText,[])
link(Str,5209601:Var3,[(391,271)])
}
Add(GetDataEx,5209601,322,266)
{
link(Data,6864257:Text,[])
}
Add(Edit,923927,434,357)
{
Left=615
Top=5
Width=90
Text=""
}

карма: 22

0
Ответов: 5446
Рейтинг: 323
#55: 2010-04-21 22:41:10 ЛС | профиль | цитата
[offtop]
Konst, боянъ. Перегоняли уже из dbf в SQLite. Поиск.
[/offtop]
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#56: 2010-04-21 23:37:19 ЛС | профиль | цитата
Konst, я перегонял вот этой прогой (см.прицеп) в .txt с разделителем , а потом грузил в StrList и ,читая построчно, выполнял
для таблицы, например, street

INSERT INTO street values(%1)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
файлы: 1dbu.rar [105.1KB] [208]
Голосовали:Konst
Разработчик
Ответов: 26200
Рейтинг: 2137
#57: 2010-04-22 00:02:05 ЛС | профиль | цитата
Tad, нашел модифицированную ассемблерную версию PosEx. Прогони у себя на тесте. Единственное оличие, так это в объявлении переменных -- строки стоят наоборот



Add(InlineCode,6506667,392,336)
{
@Hint=#14:NewPosEx (Asm)|
WorkPoints=#5:doPos|
EventPoints=#5:onPos|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|21: onPos:THI_Event;|5: |50: procedure doPos(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|71:function PosEx2(const S, SubStr: string; Offset: integer = 1): integer;|3:asm|16: PUSH EDI|16: PUSH ESI|16: PUSH EBX|16: PUSH EAX|18: OR EAX,EAX|14: JE @@2|18: OR EDX,EDX|14: JE @@2|15: DEC ECX|14: JS @@2|23: MOV EBX,[EAX-4]|19: SUB EBX,ECX|15: JLE @@2|23: SUB EBX,[EDX-4]|14: JL @@2|15: INC EBX|19: ADD EAX,ECX|19: MOV ECX,EBX|23: MOV EBX,[EDX-4]|15: DEC EBX|19: MOV EDI,EAX|0:|19:@@1: MOV ESI,EDX|13: LODSB|19: REPNE SCASB|15: JNE @@2|19: MOV EAX,ECX|16: PUSH EDI|19: MOV ECX,EBX|18: REPE CMPSB|15: POP EDI|19: MOV ECX,EAX|15: JNE @@1|23: LEA EAX,[EDI-1]|15: POP EDX|19: SUB EAX,EDX|15: INC EAX|15: JMP @@3|0:|15:@@2: POP EAX|19: XOR EAX,EAX|8: |15:@@3: POP EBX|15: POP ESI|15: POP EDI|4:end;|0:|28:procedure THiAsmClass.doPos;|5:begin|71: _hi_onEvent(onPos,PosEx2('aasftassklddhs123s123s','lddhs123s123s',3));|4:end;|0:|4:end.|
AddHint(51,46,96,13,@Hint)
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#58: 2010-04-22 00:08:37 ЛС | профиль | цитата
nesco, закачал свой тестовый сюда http://slil.ru/28997191 Пользуйся.
Сейчас твой код проверю.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26200
Рейтинг: 2137
#59: 2010-04-22 00:11:11 ЛС | профиль | цитата
Tad писал(а):
nesco, закачал свой тестовый сюда

А тестовый пример где
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#60: 2010-04-22 00:24:33 ЛС | профиль | цитата
Работает. И даже быстрее всех

------------ Дoбавленo в 00.24:
nesco писал(а):
А тестовый пример где
За отдельную плату
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1newposex.png [18.4KB] [285]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)