< návrat zpět

MS Excel


Téma: Challenge - Odstraňte diakritiku rss

Zaslal/a icon 11.1.2016 10:32

eLCHaTak mně dneska napadlo, jestli by to nešlo. Měl jsem chviličku a zkusil to. A jde to. Takže, jestli má někdo zájem, může to zkusit taky. ;)))

Odstranit diakritiku pomocí VBA není problém. Dokážete to ale pomocí vzorce(ů)?

1. Není možné použít VBA (a pro jistotu ani žádný jiný programovací jazyk) - pouze vzorce.
2. Je možné použít pomocné sloupce.
3. Musí být zachována velikost písmen.
4. Ostatní znaky musí zůstat tak jak jsou a na svých místech ;)
5. Není možné použít pomocné tabulky!!
6. Nelze použít řetězců (podobně jako ve VBA) něco jako "ÁČĎÉĚÍŇŘŠŤÚŮÝŽáčďéeěíňřšťúůýž"=>"ACDEEINRSTUUYZacdeeinrstuuyz". Řešení musí být obecné, abych nemusel myslet na to, jaké znaky se vyskytují.

Pro hodnoty
Čuňačina
Pišta Hufnágl
Áčka jako Béčka
Champs-Élysées
Curaçao
El Niño
smörgåstårta
tête-à-tête


bude výsledek
Cunacina
Pista Hufnagl
Acka jako Becka
Champs-Elysees
Curacao
El Nino
smorgastarta
tete-a-tete
Pokud použijete pomocné sloupce, vložte vždy přílohu.

Zaslat odpověď >

Strana:  « předchozí  1 2 3   další »
#029266
avatar
Pěkný nápad.

Pro použití ve vzorcích to ale nevyužiji. Minimálně dokud bude CONCATENATE hloupá.

Zpočátku jsem trochu doufal, že jste objevil něco bez pomocných vzorců.citovat
#029276
elninoslov
Ja som to tiež skúšal spracovať v jednom vzorci, cez SUBSTITUTE/DOSADIT v matici, no to sa mi nepodarilo. Ono totiž ten vzorček dáva pole už upravených znakov, a napadlo ma ho indexovať v SUBSTITUTE v matici a nahradiť nimi pôvodné, žiaľ neúspešne.

Riešenie je to zaujímavé.citovat
icon #029281
eLCHa
Díky všem, kdo to zkusili ;)

@lubo
Máte pravdu. Ono mi to v hlavě vystřelilo úplně zničeho nic, zrovna jsem dělal něco jiného.
Po čase mi došlo, že využití ve vzorcích bude asi menší než jsem doufal. Zadání už tu bylo, tak jsem ho neměnil. Obecné řešení pro odstranění diakritiky jsem ale hledal už dlouho. Pro VBA je to pro mne tím pádem přínos. Na listu bude v tomto případě asi téměř vždy lepší UDF.

Navíc jsem přišel na snadný způsob, jak vzorcem (a tentokrát bez pomocných sloupců ;) ) zjistit, zda se na určité pozici nachází písmeno nebo jiný znak nebo kdy nejdříve se v řetězci nachází "nepísmeno". A to se také může hodit.citovat
#030230
elninoslov
Urobil som Vám také porovnanie niekoľkých spracovaní, 2 porovnávacie, a 3 spracované na námet eLCHa. Tá posledná sa mne páči najviac. Nielen, že nemá problém so znakmi (ani ostatné na námet eLCHa), ale je aj rýchla.

PS: Nejak sa mi nedarí do porovnávacích stringov pre metódy 2 a 3 pridať hentie "bazmekznaky" ani cez StrConv. Asi som už úplne vypatlaný. Dajte nejaký návrh, doplním ich tam.
Příloha: zip30230_odstranenie-diakritiky.zip (29kB, staženo 64x)
citovat
icon #030237
eLCHa
Co jsou bazmekznaky?
Už asi chápu
ñÑŏŎőŐòÒśŚŝŜũŨŵŴcitovat
icon #030260
eLCHa
@elninoslov

S těmi testy je to problém. Co se týče optimalizace rychlosti VB6 (tedy i VBA) si můžete přečíst tady.
http://www.aivosto.com/vbtips/stringopt.html

Tzn podle toho se metody 2 a 3 dají ještě optimalizovat pomocí Instr. Je totiž nesmysl projíždět všechny znaky toho řetězce, když originál má např. jen 5 písmen, tedy je kratší. Podle mne některé bazmekznaky do řetězce prostě nedostanete. Můžete to zkusit obejít tak, že nepoužijete řetězec, ale číselné pole z kódy znaků a použít fci Chr nebo asi lépe ChrW.

Mé řešení má výhodu, že toto řešit nemusíte - bazmekznaky už jsou prostě zahrnuty. Jenže nemůžete zaměnit více znaků najednou - musíte jet jeden znak za druhým - takže čím delší text, tím bude asi pomalejší než 2 a 3. Pro mne je zásadní výhodou ta univerzálnost.citovat
icon #030261
eLCHa
Nedal jsem si tu odkaz na článek, tak ho dám teď ;)

http://elcha-en.blogspot.com/2016/01/how-to-remove-diacritical-marks.htmlcitovat
#030263
elninoslov
Áno máte pravdu, keď sa jedná o plnú bunku 32767 znakov a o zápis výsledku o tejto dĺžke do bunky, tak sú metódy 1 a 4 postavené na Vašom princípe pomalé (v posteli na starom booku C2D T6400 2,0 GHz) cca 19 s, ale posledná 5. (na rovnakom princípe ale cez EVALUATE) tak tá je ako blesk 1,1 s, a je o chlp rýchlejšia ako (porovnávacie) metódy 2 a 3 (1,5 s a 1,3 s).

Takže pod 32767 znakov rozhodne používať metódu 5. Nad tento počet znakov 3. (viď nižšie) doplnenú o "druhé kolo" - hľadanie kódu kompletného zoznamu bazmekznakov.

Škoda, že sa nedá dostať do tej 5. viac znakov.

------
Keď ale vynecháme zápis tejto ozruty do bunky, ale zapíšeme výsledok do stringu, tak na spomínanom pc sú výsledky úplne iné:
met. 1 : 18,242 s
met. 2 : 0,168 s
met. 3 : 0,003 s
met. 4 : 18,960 s
met. 5 : 0,390 s

Takže nad 32767 znakov je favorit 3. či už pri zápise do bunky alebo nie.

Týmto končím toto hrajkanie :)

Každopádne ďakujeme za výborný nápad s touto metódou.citovat
icon #030264
eLCHa
Přiznám se, že jsem ty kódy zatím moc nestudoval. Kouknu.
Ale jen mne tak napadlo - výhoda textu je, že se dá snadno rozdělit a zase spojit...citovat
icon #030288
eLCHa
@elninoslov

Optimalizoval jsem ten kód. Protože je opravdu škoda přejíždět celý text znak po znaku, když ten znak můžu nahradit v celém textu najednou. Jestli chcete, vyzkoušejte. Rychlostí by to mělo být zhruba na úrovni ostatních.

Aktualizace funkce REMOVE_DIACRITICScitovat

Strana:  « předchozí  1 2 3   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje