DRc писал(а): Третий вариант снизу. Да, я видел этот вариант у Tad. Плохо что работа с диском, а поиск всех вхождений со скоростью ArrayFind это конечно плюс. Как я понимаю, предел скорости достигнут. ------------ Дoбавленo в 13.43:Еще один вариант. Вариант 4. Компонент Position, и ищем в Memory. Это подходит для моих строк, я могу примерно рассчитать длину каждой строки. Так же хотелось бы добавить BlockFind верхнюю точку Position, все стало бы проще. Add(ArrayEnum,10816952,322,154) { link(onItem,7251812:doWork2,[]) link(onEndEnum,6294994:doEvent1,[]) link(Array,6260188:Array,[]) } Add(MainForm,1579138,91,112) { Width=655 Height=766 link(onCreate,1565852:doFor,[]) } Add(StrList,11935250,693,154) { FileName="spisok.txt" Point(doGetString) Point(onGetString) } Add(Edit,5998970,777,84) { Left=10 Top=175 Width=430 Text="Муфта переход. 1 1/4" - 1/2" SМшт45.442014-12-03 09:56:21" } Add(Button,1898356,399,238) { Left=10 Top=140 Caption="Search" Data=Integer(0) link(onClick,8663686:doStart,[]) } Add(ArrayEnum,3008004,707,238) { link(onItem,16076296:doCompare,[]) link(onEndEnum,5311411:doEvent1,[(769,251)(769,279)]) link(Array,13286750:Var2,[]) } Add(TimeCounter,8663686,511,238) { link(onStart,3008004:doEnum,[]) link(onStop,10799305:doText,[(569,251)(569,272)]) } Add(Label,10799305,595,266) { Left=97 Top=142 } Add(StrMask,16076296,917,238) { Point(doMask) link(onTrue,5588019:doAdd,[]) } Add(FormatStr,8161445,868,161) { DataCount=1 Mask="*%1*" link(onFString,16076296:doMask,[(908,167)(908,251)]) link(Str1,594595:Var3,[(874,138)]) } Add(Button,10304679,427,434) { Left=10 Top=240 Caption="Search" Data=Integer(0) link(onClick,4681328:doEvent1,[]) } Add(Memo,12998003,1029,455) { Left=180 Top=215 Width=255 Height=125 ScrollBars=2 } Add(TimeCounter,3104725,532,448) { link(onStart,1124591:doFind,[]) link(onStop,5230228:doText,[(618,461)(618,503)]) } Add(Label,5230228,714,497) { Left=102 Top=247 } Add(Hub,4681328,483,434) { OutCount=4 link(onEvent2,12998003:doClear,[(898,447)(898,468)]) link(onEvent3,3104725:doStart,[]) link(onEvent4,3104725:doStop,[]) } Add(ArrayFind,1124591,742,448) { Partial=0 link(onFind,15810251:doCompare,[]) link(Array,7334526:Var2,[]) link(Index,3034059:Value,[]) link(Value,2761752:Var2,[(762,320)(783,320)]) } Add(GetDataEx,13286750,707,217) { link(Data,11935250:Array,[]) } Add(If_else,15810251,798,448) { Op2=Integer(-1) link(onFalse,14604591:doRead,[]) } Add(ArrayRW,14604591,875,455) { link(onRead,12998003:doAdd,[]) link(Array,7334526:Var3,[(881,411)]) } Add(GetDataEx,7334526,742,406) { link(Data,13286750:Var3,[(748,222)]) } Add(Memory,3034059,749,350) { Default=Integer(0) } Add(Memory,16071924,777,161) { Point(Data) link(onData,748166:doLength,[]) link(Data,594595:Var2,[]) } Add(Hub,5311411,798,273) { OutCount=3 link(onEvent1,8663686:doStop,[(820,279)(820,317)(499,317)(499,251)]) link(onEvent2,12825736:doData,[(889,286)(889,335)]) link(onEvent3,5588019:doClear,[(901,293)(901,258)]) } Add(Memo,8927946,1064,308) { Left=185 Top=10 Width=255 Height=150 ScrollBars=2 } Add(StrList,5588019,1001,245) { } Add(DoData,12825736,1001,329) { link(onEventData,8927946:doText,[]) link(Data,5588019:Text,[]) } Add(StrList,1275019,252,49) { Strings=#136:900001-234563Резьба оцинкованная 20 /200шт Резьба оцинкованная 20 /200шт5.852014-05-05 09:55:305.856.902713532014-05-05 09:55:30|137:900001-234563Резьба оцинкованная 20 /200шт Резьба оцинкованная 20 /200шт5.712014-12-03 09:56:215.716.7411163302014-12-03 09:56:21|163:900001-652403Тройник для мет.пл.тр 26*20*26" Ц/Ц/Цшт Тройник для мет.пл.тр 26*20*26" Ц/Ц/Цшт127.692014-12-03 09:56:21127.69150.6811159932014-12-03 09:56:21|241:900001-651909Сифон Ани для душевого поддона 1 1/2"*90, h90 с переливом 45 40*50 хром /20/шт Сифон Ани для душевого поддона 1 1/2"*90, h90 с переливом 45 40*50 хром /20/шт220.342014-12-03 09:56:21220.34260.0011154992014-12-03 09:56:21|195:900001-652096Смеситель G-LAUF для кухни шар. 40мм на гайке 4G-4169шт Смеситель G-LAUF для кухни шар. 40мм на гайке 4G-4169шт551.082014-12-03 09:56:21551.08650.2711156862014-12-03 09:56:21|196:900001-652258Смеситель для ванны-душа, керам., коротк. излив, Ecoшт Смеситель для ванны-душа, керам., коротк. излив, Ecoшт2285.472014-12-03 09:56:212285.472696.8511158482014-12-03 09:56:21|179:900001-652316Трап 110 гор.вып. рег., металл. реш.15*15 /6/шт Трап 110 гор.вып. рег., металл. реш.15*15 /6/шт443.372014-12-03 09:56:21443.37523.1811159062014-12-03 09:56:21|123:900001-652344Тройник 1" хром Gшт Тройник 1" хром Gшт116.252014-12-03 09:56:21116.25137.1711159342014-12-03 09:56:21|290:900001-652123Смеситель Frap ван., керам., дл. излив S350 mm, POLLMNлюкс(латунь), лейка 1 режим, хром G2245^7130Sшт Смеситель Frap ван., керам., дл. излив S350 mm, POLLMNлюкс(латунь), лейка 1 режим, хром G2245^7130Sшт1240.952014-12-03 09:56:211240.951464.3211157132014-12-03 09:56:21|185:900001-651438Отвод 50 угол 67 для внутр.кан. (г.Красноярск) /35/шт Отвод 50 угол 67 для внутр.кан. (г.Красноярск) /35/шт102014-12-03 09:56:2110.0011.8011150282014-12-03 09:56:21|0:| Point(doGetString) Point(onGetString) } Add(For,1565852,154,126) { End=1000 link(onEvent,8533446:doEnum,[]) link(onStop,10816952:doEnum,[(203,139)(203,160)]) } Add(StrList,6260188,308,49) { Strings=#148:900001-651346Муфта переход. 1 1/4" - 1/2" SМшт Муфта переход. 1 1/4" - 1/2" SМшт45.442014-12-03 09:56:2145.4453.6211149362014-12-03 09:56:21|210:900001-651735Прокладка сантех резина Ду 74*94 круглая под смыв.бачок /200шт/шт Прокладка сантех резина Ду 74*94 круглая под смыв.бачок /200шт/шт8.782014-12-03 09:56:218.7810.3611153252014-12-03 09:56:21|148:900001-651346Муфта переход. 1 1/4" - 1/2" SМшт Муфта переход. 1 1/4" - 1/2" SМшт45.442014-12-03 09:56:2145.4453.6211149362014-12-03 09:56:21|210:900001-651735Прокладка сантех резина Ду 74*94 круглая под смыв.бачок /200шт/шт Прокладка сантех резина Ду 74*94 круглая под смыв.бачок /200шт/шт8.782014-12-03 09:56:218.7810.3611153252014-12-03 09:56:21| Point(doGetString) Point(onGetString) } Add(HubEx,7251812,432,154) { link(onEvent,11935250:doAdd,[]) } Add(ArrayEnum,8527459,497,70) { } Add(ArrayEnum,8533446,266,126) { link(onItem,7251812:doWork1,[(436,132)]) link(Array,1275019:Array,[]) } Add(Edit,180565,840,364) { Left=490 Top=250 Width=95 } Add(DoData,4603611,700,371) { link(onEventData,180565:doText2,[]) link(Data,11935250:Count,[]) } Add(StrList,15665462,1400,385) { } Add(Button,5367531,1050,378) { Left=10 Top=355 Caption="Search" Data=Integer(0) link(onClick,153000:doEvent1,[]) } Add(TimeCounter,2402154,1155,392) { link(onStart,11090039:doSearch,[(1241,398)(1241,370)]) link(onStop,13068211:doText,[(1241,405)(1241,447)]) } Add(Hub,153000,1106,378) { OutCount=4 link(onEvent2,15665462:doClear,[(1260,391)(1260,398)]) link(onEvent3,2402154:doStart,[]) } Add(Label,13068211,1295,441) { Left=102 Top=362 } Add(SearchInFile,11090039,1295,364) { FileName="spisok.txt" Sensitive=1 Point(String) Point(onEnd) link(onSearch,15665462:doAdd,[(1363,377)(1363,391)]) link(Text,7935619:Var2,[(1308,352)(972,352)(972,561)(678,561)]) link(onEnd,3939390:doEvent1,[(1346,384)(1346,447)]) } Add(GetDataEx,2761752,777,287) { link(Data,16071924:Value,[]) } Add(Hub,6294994,511,161) { OutCount=4 link(onEvent1,4603611:doData,[(538,167)(538,377)]) link(onEvent2,11935250:doSave,[(588,174)(588,195)]) link(onEvent3,7545657:doValue,[(571,181)(571,104)]) link(onEvent4,16071924:doValue,[(651,188)(651,167)]) } Add(DoData,9341557,1400,455) { link(onEventData,12549506:doAdd,[(1440,461)(1440,391)]) link(Data,15665462:Text,[]) } Add(Hub,3939390,1365,441) { OutCount=3 link(onEvent1,2402154:doStop,[(1391,447)(1391,426)(1143,426)(1143,405)]) link(onEvent2,12549506:doClear,[(1414,454)(1414,398)]) link(onEvent3,9341557:doData,[]) } Add(Memo,12549506,1449,385) { Left=180 Top=365 Width=255 Height=125 ScrollBars=2 } Add(Position,11407394,532,630) { ZeroPos=0 Point(doReset) link(onSearch,10260637:doCompare,[]) link(Str,5962527:Var2,[]) link(Target,7935619:Var1,[(545,551)]) } Add(StrList,5382399,991,677) { } Add(Button,6800550,291,677) { Left=10 Top=505 Caption="Search" Data=Integer(0) link(onClick,1499322:doEvent1,[]) } Add(TimeCounter,11742731,396,691) { link(onStart,2104991:doWork2,[(480,697)(480,636)]) link(onStop,10969254:doText,[(482,704)(482,739)]) } Add(Hub,1499322,347,677) { OutCount=4 link(onEvent2,5382399:doClear,[]) link(onEvent3,11742731:doStart,[]) } Add(Label,10969254,536,733) { Left=102 Top=512 } Add(DoData,9038010,991,747) { link(onEventData,14577683:doAdd,[(1053,753)(1053,739)]) link(Data,5382399:Text,[]) } Add(Hub,14642835,949,733) { OutCount=5 link(onEvent1,11742731:doStop,[(975,739)(975,721)(384,721)(384,704)]) link(onEvent2,14577683:doClear,[]) link(onEvent3,9038010:doData,[]) } Add(Memo,14577683,1082,733) { Left=180 Top=515 Width=255 Height=125 ScrollBars=2 } Add(Memory,7545657,616,98) { Point(Data) link(Data,11935250:Text,[(622,86)(640,86)(640,218)(699,218)]) } Add(GetDataEx,7935619,672,546) { link(Data,2761752:Var1,[(678,292)]) } Add(If_else,10260637,581,630) { Op2=Integer(0) link(onFalse,1212223:doCalc,[]) } Add(HubEx,2104991,504,630) { link(onEvent,11407394:doSearch,[]) } Add(Hub,16755865,777,637) { link(onEvent1,10977735:doCopy,[]) link(onEvent2,2104991:doWork3,[(803,650)(803,674)(508,674)]) } Add(Copy,10977735,812,637) { link(onCopy,2539464:doSearch,[]) link(Str,5962527:Var3,[(818,607)]) link(Position,1212223:Result,[(825,625)(748,625)(748,681)(671,681)]) link(Count,681832:Result,[(832,620)(763,620)(763,677)(720,677)]) } Add(GetDataEx,5962527,532,602) { link(Data,7545657:Value,[(538,366)(622,366)]) } Add(GetDataEx,594595,777,133) { link(Data,5998970:Text,[]) } Add(Length,748166,819,161) { link(onLength,8161445:doString,[]) link(Str,594595:Var1,[(825,149)(774,149)(774,138)]) } Add(BlockFind,2539464,882,637) { IncludeBlock=1 StartBlock=" " EndBlock=" " link(onSearch,5382399:doAdd,[(952,643)(952,683)]) link(onEndSearch,14642835:doEvent1,[(932,650)(932,739)]) } Add(FastMathParse,681832,714,637) { DataCount=3 MathStr="%1 + (%2*2) - %3" ResultType=0 link(onResult,16755865:doEvent1,[]) link(X1,11407394:Position,[(720,625)(629,625)(629,674)(538,674)]) link(X2,14024403:Var2,[]) } Add(FastMathParse,1212223,665,637) { MathStr="%1 - %2" ResultType=0 link(onResult,681832:doCalc,[]) link(X2,14024403:Var1,[(678,579)]) } Add(GetDataEx,14024403,721,574) { Angle=1 link(Data,748166:Result,[(825,579)]) } Add(InfoTip,2993960,248,588) { Info=#9:Вариант 4| Font=[MS Sans Serif,8,0,255,1] Frame=3 Width=953 Height=207 Margin=5 }
Работает в 4-5 раз быстрее.------------ Дoбавленo в 14.17:А на 1000000 строк в 10 раз быстрее. https://cloud.mail.ru/public/96fd20ced98f/serch.jpg
|