Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 13. 12. 2012 10:15:17

Pepeee
Člen
Registrace: 31. 5. 2012
Příspěvků: 6

Vyhledání mezery zprava - VYŘEŠENO

Dobrý den, mám importovaný soubor dat z PDF každou položku v jedné buňce. Položka je složená z kódu výrobku a ceny. Kód výrobku je rozdílně dlouhý, ale cena je vždy na konci řádku oddělená první mezerou zprava. Příklad:

27051 05 6, 39 10.110,00 - potřebuji cenu 10.110,00
29209 26 284,00 - potřebuji cenu 284,00
.
.
.

Nenapadá někoho řešení?

Editoval Pepeee (13. 12. 2012 12:20:53)

Offline

#2 13. 12. 2012 11:16:35

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhledání mezery zprava - VYŘEŠENO

Problém není složitý. Mezera má v ASCII (i v UNICODE) číslo 32. Takže hledáme CODE(32), nebo CHAR(32). Ze zkušenosti ale vím, že to může být i jiný znak. Zejména po tom exportu. Potvrďte, že ta Vaše mezera má číslo tohoto znaku. Zjistíte to dotazem SERACH, nebo FIND.
   Například text v A1 ošetříme vzorcem v B1 : =FIND(CHAR(32);A1;1)
Kde hledáme pomocí CHAR v buňce A1 a sice od první pozice. Vzorec vyhodí číslo pozice na které najde mezeru, ale vrátí jen první nalezenou. Takže pak se hledá dalším vzorcem právě od té první dál. Když najdeme první mezeru na 5. pozici, druhé hledání začíná od 6. pozice. Takže jde vlastně o to, najít tu správnou mezeru z několika možných - pokud tam je mezer více.
   Po nalezení pozice mezery dáme vzorec například do C1 : = LEFT(A1;5) - dostaneme první část výrazu.
Pro získání druhé části dáme do D1 : = RIGHT(A1;LEN(A1)-5). Správně odečteme od délky řetězce číslo 6, protože pokud je první část dlouhá 5 znaků, pak je mezera 6. znak a nám stačí vrátit znaky za touto mezerou a pak bychom vraceli jen řetězec bez 7 znaků (5+2).
   Pak už stačí vzorce načíst do paměti, vložit zpět ve formě hodnot a sloupce A a B odstranit. Praktické hledání poslední mezery obnáší vyhledávání pomocí podmínky IF. Hledáme LEN(A1) - X(nejmenší počet znaků druhé části) - až do Y(největší počet znaků druhé části). Určitě je to možné udělat i jinak. Pro dlouhé řetězce a mnoho řádků bychom použili makro.
   Pokud Vám tento popis stačí, uveďte jen v názvu "VYŘEŠENO", v opačném případě potvrďte, že to co vypadá jako mezera je CHAR(32). Číslo znaku se hledá jako CODE(). Takže doporučuji hledaný znak samostatně zkopírovat do nějaké buňky - řekněme do C3 a v D3 zadáte : =CODE(C3). Výsledkem je číslo znaku.

Editoval neutr (13. 12. 2012 11:29:56)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 13. 12. 2012 12:20:31

Pepeee
Člen
Registrace: 31. 5. 2012
Příspěvků: 6

Re: Vyhledání mezery zprava - VYŘEŠENO

Moc děkuji za odpověď a za radu. Mezera je opravdu klasická mezera 32. Určitě by šel problém vyřešit soustavou vzorců jak popisujete a ještě jednou děkuji za radu. Kód výrobku uvedený nahoře je rozdělený 4 mezerami, hledal bych tedy pozici té čtvrté pomocí FIND a IF, pokud jsem to pochopil dobře a potom vlastně celý text před touto mezerou funkcí RIGHT odečetl od délky textu.

Mezitím jsem si ale vytvořil řešení, kde jsem transponoval slova v řádku a zleva už první slovo získat umím.

Děkuji a značím jako vyřešeno.

Offline

#4 13. 12. 2012 14:42:39

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhledání mezery zprava - VYŘEŠENO

To je vtipné řešení. Teda já jsem měl ještě jedno - z jiného soudku. Když by jste ty buňky uložil jako CSV a zpětně to načetl, vloží Calc každé slovo do nového sloupce.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 13. 12. 2012 16:56:54

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Vyhledání mezery zprava - VYŘEŠENO

Poslední slovo jednoduše oddělíte vzorcem

=MID(A1;1+FIND("^";SUBSTITUTE(A1;" ";"^"; LEN(A1)-LEN(SUBSTITUTE(A1;" ";""))));1000)

Vysvětlení:

LEN(A2)-LEN(SUBSTITUTE(A2;" ";""))

spočítá počet mezer

SUBSTITUTE(A2;" ";"^"; LEN(A2)-LEN(SUBSTITUTE(A2;" ";"")))

Nahradí poslední mezeru znakem "^" - předpokládám, že tento znak se v řetězci nevyskytuje, pokud ano, lze ho nahradit vhodnějším znakem nebo řetězcem

FIND("^";SUBSTITUTE(A2;" ";"^"; LEN(A2)-LEN(SUBSTITUTE(A2;" ";""))))

Najde pozici vloženého znaku "^", což je pozice poslední mezery, což nám tačí na oddělení posledního slova funkcí MID.

Offline

Zápatí