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

#1 18. 9. 2015 21:09:26

idp
Člen
Registrace: 18. 9. 2015
Příspěvků: 16

Odstranění řádků, které neobsahují ani jeden z výrazů - VYŘEŠENO

Dobrý den, rád bych v Calcu odstranil z csv douboru ty řádky, které neobsahují v žádné z buněk ani jeden z určitých výrazů. Jak tohoto docílit? Děkuji

Editoval idp (19. 9. 2015 13:48:15)

Offline

#2 19. 9. 2015 05:37:47

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

Re: Odstranění řádků, které neobsahují ani jeden z výrazů - VYŘEŠENO

Když načtete CSV do Calcu (vyskočí dotaz na filtr - ten odsouhlasíte, nebo zvolíte jiný než nabídnutý - důležitější je volba separátorů) uvidíte vše jako text rozdělený do řádků a sloupců. Zásadně vkládejte do zcela prázdného listu.
     Návod platí pro vkládání "obyčejného" (neformátovaného) textu obecně.


     Problémy z toho plynoucí a chyby kterých se můžete dopustit dík malé, nebo žádné zkušenosti :
A - veškerý text je jen v jediné buňce.
B - Text je ve více řádcích a sloupcích, ale rozdělení je nesprávné.
C - Některé řádky obsahují zalomení které může vypadat jako rozdílná výška řádku, nebo je tam hyperlink.


     Po vložení stiskněte Ctrl+END. Kurzor skočí na poslední buňku. Kvůli tomu v sešitě nemá být nic jiného nežli importovaný text.
     Nyní poznáte kolik má import sloupců a řádků. Při tom se může stát, že stojíte v prázdné buňce a okolo této buňky nic vidět není.
     Skočte o 1 buňku do pravé strany. Klidně tam napište třeba jedničku, nebo cokoliv jiného. To je nový "konec souboru" respektive poslední buňka pomocného sloupce ve kterém budou vzorce pro eliminaci prázdných řádků.


     Nyní půjde o to, jak vypadá import po načtení - tedy podle možností A až C. Nejdříve si popíšeme nejčastější případ "bez záludností" - tedy text je v jediném sloupci (nejlépe A).


- PŘÍKLAD :
Text končí v buňce A100. Skočíme do buňky B100. Sem napíšeme vzorec podle toho s čím vystačíme.
1). - Nezáleží nám na pořadí řádků. Vzorec v B100 '=IF(A100 = "";1;"")'. Zkontrolujeme správnost tak, že ho nejprve zkopírujeme do úseku buněk B99:B101. V buňkách B99 a B100 by nemělo být vůbec nic, zato v buňce B101 by měla být jednička.
      Nyní vzorec zkopírujeme do úseku B1:B100 (pomocí Ctrl+V).
Doporučuji hned poté (tento krok v takovém případě není nutný, ale jindy ano).
- Vzorce úseku načíst do paměti pomocí Ctrl+C (úsek je stále vybrán - je "modrý").
      Ihned vložíme zpět jen jako hodnoty a text (pravé tlačítko myši - kontextová nabídka "vložit jinak" - zatrženo jen čísla, text popřípadě datum a podobně).

      Následně úsek A1:B100 setřídíme podle sloupce "B". Prázdné řádky mají jedničku a jsou na konci. Stačí jednoduše vybrat Ctrl+End, hned poté Shift+Ctrl+šipka nahoru (vybrány jsou všechny jednice) a tyto smazat, nebo alternativně smažeme celý sloupec "B".


2).- Na pořadí řádků záleží :
     Postup je stejný, jen je jiný vzorec a MUSÍ se po vykopírování vzorec načíst a vložit zpět jen hodnoty + čísla, popřípadě formáty jako je datum, měna ap.

=IF(A1="";"";ROW())

     Nyní vypadá pomocný sloupec jinak. Tam kde je v buňce "A" text je uvedeno číslo řádku, tam kde je prázdná buňka v "A" je také prázdná buňka v "B".
     Opět setřídíme úsek A1:B100 podle sloupce "B". Následně můžeme sloupec "B" celý smazat.


                     ÚPLNÝ POSTUP
     pro 1 sloupec textu včetně odstranění netisknutelných znaků

1.- Do pomocného sloupce (poslední buňka B100) nejprve vložíme vzorec

=CLEAN(A100)

2.- Pomocný sloupec načteme zpět do paměti a vložíme jen jako text a čísla.
3.- Původní sloupec "A" odstraníme. Tím se původní "B" stane sloupcem "A".
4.- Nyní do pomocného sloupce vložíme eliminační vzorec - nejlépe ten který zachová pořadí :

=IF(A1="";"";ROW())


5.- Opět načteme do paměti, vložíme zpět jen jako čísla a text.
6.- Setřídíme podle "B".
7.- Pomocný sloupec smažeme.
     Vzorec "=CLEAN()" vyčistí všechny netisknutelné znaky, tedy také různá zalomení mimo hyperlinku (pokud smaže i hyperlinkové zalomení je to chyba).



                     ÚPLNÝ POSTUP
     pro více sloupců textu včetně odstranění netisknutelných znaků

     Předpokládáme, že pomocný sloupec může být ve sloupci "D"
1.- Do sloupce "D100" vložíme

=CLEAN(A100)

    Do sloupce "E100" vložíme

=CLEAN(B100)

    Do sloupce "F100" vložíme

=CLEAN(C100)

    Do sloupce "G100" vložíme

=IF(LEN(A100)+LEN(B100)+LEN(C100)=0;"";ROW())

2.- Úsek D100:G100 zkopírujeme do úseku D1:G100.
3.- Pomocné sloupce (D1:F100) načteme zpět do paměti a vložíme jen jako text a čísla.
4.- Původní sloupce "A,B,C" odstraníme. Tím se původní "D,E,F" stane sloupcem "A,B,C" + pomocný "D".
5.- Nyní načteme do paměti a vložíme zpět jen hodnoty pomocnéhosloupce (Nyní "D").
6.- Následně přetřídíme podle sloupce "D".
7.- Pomocný sloupec "D" smažeme.
     

                     Ostatní POSTUPY
     zejména pokud je import v jediné buňce a jiné problémy.

Jedná se o problémy se separátory. Buď je provedena špatná volba separátorů, nebo v textu skutečně žádné nejsou. Často jde o text oddělený čárkami. Ty lze v importním filtru zvolit stejně jako jiné znaky a možnosti.
     Problém může být s různými výstupy technologií - z logerů a podobně. Také možná některé výpisy z portálů. Tam je to většinou postaveno záměrně, aby si uživatel musel pořídit program který info přechroupe tak jak je potřeba.
     Jsou to individuální případy a nemají paušální řešení. Platí, že je třeba vytipovat kde mají být nějaké separátory. Když na to nestačí volba separátorů,musíme si je udělat pomocí volby "Najít a nahradit". Při tom můžeme zadávat i regulární výrazy.


     Takže pokud jsou údaje v jedné buňce a chceme například každý text začínající na "datum" do nového řádku zadáme najít "datum" - nahradit za "\n datum". Následně vše uložit jen jako text a exportovat jako .CSV, nebo .Txt. Tento soubor se po opětovném načtení už rozdělí do řádků.
     Možností je také vložit CHAR(10), nebo CHAR(13) a podobně. Také je možné ještě vložit separátory pro rozdělení do více sloupců.


     Uvedl jsem jenom ilustrační možnosti. Obecně by se našlo vícero postupů pro všechny varianty úprav importů. V podstatě jde o odhad co a jak. Já osobně pracují někdy v textovém editoru PsPad, jindy s CSValidátorem a podobně. Ale o zpracování textu by se toho dalo napsat mnoho. I tohle už je samo o sobě velice objemné - snad to pomůže :-)

Editoval neutr (19. 9. 2015 06:01:41)


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

Offline

#3 19. 9. 2015 08:33:29

idp
Člen
Registrace: 18. 9. 2015
Příspěvků: 16

Re: Odstranění řádků, které neobsahují ani jeden z výrazů - VYŘEŠENO

děkuji za pomoc, import proběhl v pořádku, teď mi jde o to, ponechat pouze ty řádky které v žádné buňce neobsahují ani jeden z výrazů například: odstranit řádky, které v žádné buňce neobsahují Škoda nebo Opel nebo Renault nebo Seat

Offline

#4 19. 9. 2015 08:46:58

idp
Člen
Registrace: 18. 9. 2015
Příspěvků: 16

Re: Odstranění řádků, které neobsahují ani jeden z výrazů - VYŘEŠENO

myslím, že pokud není takováto funkce v programu, mohlo by se to provést nějak takto: vytvořit sloupec, ve kterém by při výskytu Škoda nebo Opel nebo Renault nebo Seat byla jednička jinak nula, poté bych to jednoduše vyfiltroval bohužel se mi to pomocí funkcí find ani search nedaří

Offline

#5 19. 9. 2015 09:46:40

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

Re: Odstranění řádků, které neobsahují ani jeden z výrazů - VYŘEŠENO

Pokud jsou ty názvy v samostatných buňkách samostatně, můžete použít vyhledávání pomocí COUNTIF(). Pokud je s těmi názvy ještě něco tak by se to muselo hledat pomocí SEARCH(), nebo FIND(). To jsou textové funkce pro hledání a najdou heslo v rámci delšího textu.
     Pokud tedy máte ty názvy samostatně tak vyzkoušejte konstrukci :
A: pro jednu buňku - například A1 : -  V B1 vzorec

=IF(OR(COUNTIF(A1;"SEAT")=1;COUNTIF(A1;"ŠKODA")=1;COUNTIF(A1;"OPEL")=1;COUNTIF(A1;"RENALT")=1)=1;"";1)

     Pokud je tam nějaký text, musíte použít : variantu buď FIND() - ta je Case Sensitive to znamená že hledá přesný tvar. Například hledá jen SEAT - a najde ho například ve větě "Kdo má SEAT"?. Už ale ve tvaru "Kdo má Seat"? nenajdenic.

=IF(OR(COUNTIF(A1;"SEAT")=1;COUNTIF(A1;"ŠKODA")=1;COUNTIF(A1;"OPEL")=1;COUNTIF(A1;"RENALT")=1)=1;"";1)
=IF(OR(ISERROR(FIND("SEAT";A1;1))=0;ISERROR(FIND("ŠKODA";A1;1))=0;ISERROR(FIND("OPEL";A1;1))=0;ISERROR(FIND("RENALT";A1;1))=0)=0;"";1)
=IF(OR(ISERROR(SEARCH("SEAT";A1;1))=0;ISERROR(SEARCH("ŠKODA";A1;1))=0;ISERROR(SEARCH("OPEL";A1;1))=0;ISERROR(SEARCH("RENALT";A1;1))=0)=0;"";1)

B : Pro více sloupců můžeme vzorce sečíst : Abychom je mohli sečíst musíme změnit výsledek z "" (dvě uvozovky = nic vypsáno) na nulu. Potom vzorce vypadají takto :

=IF(OR(COUNTIF(A1;"SEAT")=1;COUNTIF(A1;"ŠKODA")=1;COUNTIF(A1;"OPEL")=1;COUNTIF(A1;"RENALT")=1)=1;0;1)
=IF(OR(ISERROR(FIND("SEAT";A1;1))=0;ISERROR(FIND("ŠKODA";A1;1))=0;ISERROR(FIND("OPEL";A1;1))=0;ISERROR(FIND("RENALT";A1;1))=0)=0;0;1)
=IF(OR(ISERROR(SEARCH("SEAT";A1;1))=0;ISERROR(SEARCH("ŠKODA";A1;1))=0;ISERROR(SEARCH("OPEL";A1;1))=0;ISERROR(SEARCH("RENALT";A1;1))=0)=0;0;1)

Takto upravené už jdou sčítat například pro tři sloupce :

IF(OR(ISERROR(FIND("SEAT";A1;1))=0;ISERROR(FIND("ŠKODA";A1;1))=0;ISERROR(FIND("OPEL";A1;1))=0;ISERROR(FIND("RENALT";A1;1))=0)=0;0;1)+IF(OR(ISERROR(SEARCH("SEAT";B1;1))=0;ISERROR(SEARCH("ŠKODA";B1;1))=0;ISERROR(SEARCH("OPEL";B1;1))=0;ISERROR(SEARCH("RENALT";B1;1))=0)=0;0;1)+IF(OR(ISERROR(SEARCH("SEAT";C1;1))=0;ISERROR(SEARCH("ŠKODA";C1;1))=0;ISERROR(SEARCH("OPEL";C1;1))=0;ISERROR(SEARCH("RENALT";C1;1))=0)=0;0;1)

     Nejde o nic světoborného jen nejdříve zkopírujte do pomocného sloupce (příklad D1) vzorec pro "A1". Po vložení ho znovu zkopírujte ale už z D1 do E1 a F1.
     Následně celý vzorec z F1 (bez rovnítka) zkopírujte a vložte ke vzorci do E1 : =Vzorec(E1)+ Vzorec(F1). Totéž pak uděláte se vzorcem v E1 - zkopírujete vše mimo "=" a vložíte ke vzorci v buňce D1. Pak to vypadá v buňce D1 : =Vzorec(D1) + Vzorec(E1)+ Vzorec(F1)


     Lze to udělat i jinými prostředky - zejména maticovými vzorci, nebo makry. Tento postup je "klasický"a má také mnoho variant. Takže když byste měl mnoho sloupců mohlo by se stát, že se sečtené vzorce do jedné buňky nevejdou, nebo je mnoho řádků a stroj je pomalý.......
     Pak by bylo na místě vylepšit vzorce, nebo vytvořit makro. Myslím si, že ale pro běžné potřeby v řádech několika málo tisíců řádků tato metoda potačuje.


PS -
Funkce COUNTIF() vyhledává Non Case sensitive - najde každý tvar, ale musí být v buňce sám.
     V případě jednotlivých i sloučených vzorců jsem zapoměl připsat, že se musí také zkopírovat a vložit zpět jen jako hodnoty a čísla. Následně se musí přetřídit a správně promazat (nechtěné údaje s názvy a pomocný sloupec).
     V případě sloučených vzorců zůstávají v pomocném sloupci čísla a nuly - pak je problém setřídit mnoho řádků a najít rozhraní nuly a větších čísel. Pak můžeme buď vytvořit další pomocný sloupec se vzorcem - například pro sloupec "H1" ve sloupci "K1" "IF(H1=0;"";1)". Následně obvyklý postup - načíst do paměti, vložit zpět jen čísla a text a vše podle toho setřídit + promazat.
     To jaký výsledek se bude zapisovat do pomocného sloupce lze ovlivnit jednoduše na konci podmínky IF(podmínka ; splněna(něco se zapíše třeba A) ; nesplněna zapíše se něco jiného - třeba B).
     Konstrukce uvnitř podmínky je někdy složitá, ale ve Vašem případě odlišujete jenom ty řádky, které něco obsahují, nebo zde není vůbec nic. Po setřídění můžete rozhodnout kterou množinu dat smažete. Takže nyní už si snad poradíte snadno.

Editoval neutr (19. 9. 2015 10:09:58)


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

Offline

#6 19. 9. 2015 13:46:08

idp
Člen
Registrace: 18. 9. 2015
Příspěvků: 16

Re: Odstranění řádků, které neobsahují ani jeden z výrazů - VYŘEŠENO

děkuji, vyřešeno

Offline

Zápatí