You are here: PSPad forum > České diskuzní fórum > Re: Výkon při hledání a nahrazování v souboru
Posted by: 4ever | Date: 2018-09-30 15:37 | IP: IP Logged
Pracuji teď s jedním velkým textovým souborem, který má kolem 40 MB. Dělám tam nahrazování. Většinu práce odvedu pomocí programu v Delphi (napíšu kód s regulárními výrazy a nahrazení je hotové za několik vteřin). Tak mě překvapuje, že v PSPadu ta samá věc (i když nepoužiju regulární výraz) trvá několik minut. Myslím, že by bylo fajn mít v PSPAdu ještě jednu funkci pro pokročilejší uživatele, kteří by mohli využít síly regulárních výrazů v plném rozsahu, ale i výkonného hledání v bufferu z načteného souboru (prostě a jednoduše: kašlat na syntaxy a zvýrazňování nebo číslování řádků, to mě nezajímá, protože u tak velkého souboru to jen zdržuje otevírání). Udělat prostě primitivní nahrazování pomocí regex, které změní soubor, bez toho že by ukládal jednotlivé kroky nebo posouval kurzor, data na obrazovce, čímž se celý proces jen zdržuje.
No a k těm současným regulárním výrazům co jsem mohl vyzkoušel v okně hledání a nahrazování, tam mi chybí tvrzení typu (?!co nechci) , (?<= co má předcházet), (?<! co nemá předcházet), (?= co má následovat), (?! co nemá následovat). A případně \K pro reset předlohy a \b pro hranice slova. Takže na to používám program v Delphi, který si vždy poupravím a zkompiluju.
Jo a ještě jedna podstatná věc co mi chybí. Totiž když hledám ve dvou různých souborech, jeden je originál a druhý je změněný, tak v každém okně souboru používám jiný parametr hledání. V jednom hledám s regulárním výrazem \w+neco a v druhém zase necojiného ... no a tím že to musím pokaždé znova měnit to dost zdržuje. Takže by to chtělo mít v tom okně na hledání možnost aktivovat ukládat zadání/parametry hledání přímo pro daný soubor.
Tedy pokud by byly tyto dvě poslední funkce, tvzení o předchozím a následujícím výskytu a funkce pamatování parametrů hledání, tak by to už bylo hodně vymakané a člověku by ani tak nemusel vadit ten nízký výkon. Pokud má člověk dostatek času.
Posted by: vbr | Date: 2018-09-30 19:08 | IP: IP Logged
Zdravim,
take se primlouvam za posileni a eventualni zrychleni vyhledavacich a nahrazovacich funkci s regulernimi vyrazy, pokud to bude schudne - snad to bude jednodussi se zvazovanou modernizaci komponenty editoru.(?) Dalsi myslim dulezita oblast je hledani a nahrazovani koncu radku.
Pro podobne pouziti jde castecne pouzit skriptovani - pokud se prevezme cely obsah editoru, provede nahrazeni a opet nacte do editoru vysledny text, jsou nektera nahrazeni rychlejsi nez v editoru.
Sam pouzivam jednoduche skripty v javascriptu, takze pouzite regulerni vyrazy mohou zahrnovat jen cast z pozadovanych funkci ("lookaround assertions" aj.).
Nevim, jestli je nejak mozne pouzit Delphi pomoci WSH skriptovani, mozna by to bylo jinak mozne s pouzitim jako samostatneho programu prirazeneho v nastrojovem panelu.)
vbr
Posted by: 4ever | Date: 2018-09-30 21:37 | IP: IP Logged
Začátky a konce řádky mi vyhledávat šly (^ a $), nahrazování odstavců v kratším textu dělám ve Wordu, ten s tím nemá problém. Nejčastěji to používám, když potřebuju seznam slov, který je odřádkovaný hodit do jedné línie a zaměnit odstavec za |. Vznikne mi tak seznam alternativ pro regulární výraz. Některé tyhle seznamy slov mají i 11-12kB; a aplikováním takového regexu na 40MB soubor trvá asi ~3-5 minut (v Delphi). O tomhle si v PSPadu mohu nechat jenom zdát. Ale nebylo by špatné moci si ty seznamy s předlohami naimportovat dynamicky z nějakého souboru. Jenže to už by bylo o trochu víc práce s programováním. Já to taky mám udělané dynamicky. Předlohy mám externě uložené v souborech a DIRegEx si to sám zkompiluje při runtime (Edit: Blbě jsem se vyjádřil, není to kompilátor, ale knihovna, ale co už...).
Edited 1 time(s). Last edit at 2018-09-30 21:39 by 4ever.
Posted by: pspad | Date: 2018-10-01 05:38 | IP: IP Logged
Rozdíl mezi nahrazováním napsaným v čemkoliv a tím, co dělá PSPad je v tom, že PSPad kromě nahrazování vkládá každé nahrazení do UNDO bufferu, při tom musí spočítat pozici v souboru na pozici kurzoru (to znamená přepočítat tabulátory atd.)
Dále se při každém nahrazení volají události - např. záleží na přepínači, zda potvrzovat každé nahrazení nebo automaticky nahrazovat.
Do toho se plete ještě vykreslování, které jsem se snažil v komponentě potlačit.
Zkrátka režie je mnohonásobně vyšší, než když mám obyčejný text a pustím na něj hledání/nahrazení
Posted by: 4ever | Date: 2018-10-01 14:22 | IP: IP Logged
No právě; a nešlo by to prostě obejít? Prostě soubor otevřeš jen pro čtení, nebudou se sledovat žádné změny, bude otevřen jen na prohlížení, bez zvýraznění syntaxe. Pak otevřeš pokročilejší nástroj na hledání který by využíval kompletně všech regulárních výrazů a přistupoval by k bufferu čistě jako k textu. Následně odsouhlasíš zadání a změněný buffer se načte jako soubor ještě před tím než soubor uložíš přes ctrl+s. Mohl bys tuto funkci pasivního prohlížení pojmenovat prostě jako prohlížeč obsahu souborů. Ten soubor prostě otevřeš zvlášť mimo ten složitý řídící mechanismus, který používáš k "obsluze souboru". Zobrazení čísel řádků by taky nebylo nutné a mohlo by být případně volitelné. Při tomto pasivním prohlížení vlastně jen potřebuji mít k dispozici funkci hledání F3.
Edited 1 time(s). Last edit at 2018-10-01 14:23 by 4ever.
Posted by: 4ever | Date: 2018-10-17 10:45 | IP: IP Logged
Jinak bych chtěl poděkovat, že jste vyslyšel mou prosbu z minulosti, ohledně zvýrazňování bloků if begin end else begin end; já si toho všiml až včera, když jsem zkopíroval jeden kód z Delphi IDE do PSPadu. Tohle je velká úleva, když člověk může překontrolovat bloky.
Editor PSPad - freeware editor, © 2001 - 2024 Jan Fiala, Hosted by Webhosting TOJEONO.CZ, design by WebDesign PAY & SOFT, code Petr Dvořák, Privacy policy and GDPR