Část řetězce Vyřešeno

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

Petr__
nováček
Příspěvky: 13
Registrován: srpen 20
Pohlaví: Muž

Část řetězce

Příspěvekod Petr__ » 25 srp 2020 10:20

Zdravím,

prosím o radu. Mám kvantum hodnot, které dále upravuji v PowerQuery v Excelu. Zasekl jsem se v bodě, kdy potřebuji použít nachystané PQ na různé zdroje, kde se liší hodnoty signálů a já potřebuji použít jen část řetězce a nemůžu se odpíchnout od počtu písmen zleva ani zprava - příp. Text.Middle nelze použít.

Příklad:
IO.DIS._CD0xxxxx_SWLH1.SigHW
D_CE0yyyyy.CE0yyyyy_SD

Jde mi o osekání nepotřebných řetězců, aby výsledek vypadal takto:
CD0xxxxx_SWLH1
CE0yyyyy_SD

Díky za každou radu.



Reklama
Uživatelský avatar
ITCrowd
Tvůrce článků
Elite Level 12.5
Elite Level 12.5
Příspěvky: 20362
Registrován: březen 10
Pohlaví: Muž

Re: Část řetězce

Příspěvekod ITCrowd » 25 srp 2020 13:07

Můžeš použít vba (vbs).
Kód vypadá takto:

Kód: Vybrat vše

vstup = "IO.DIS._CD0xxxxx_SWLH1.SigHW"
tst = "CD0"
k = Len(vstup)
k = k - 3
For i = 1 To k
  If Mid(vstup, i, 3) = tst Then vystup = Mid(vstup, i, 14)
Next
WScript.Echo vystup

Chceš-li vědět, jak to funguje můžeš ten kód zkopírovat do notepadu a uložit s příponou .vbs. A stačí poklepat. Výsledek pak vypadá takto:
vysledek.png

Jak si analogicky změnit druhou podmínku, na to jistě už přijdeš sám.
Nemáte oprávnění prohlížet přiložené soubory.
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

MePExG
Level 2
Level 2
Příspěvky: 193
Registrován: srpen 16
Pohlaví: Muž

Re: Část řetězce

Příspěvekod MePExG » 25 srp 2020 20:40

Použite najväčšiu pýchu PQ a to je, že vysekávací vzorec si vie vytvoriť samo, na základe príkladových hodnôt. Kde to nájdete je na obrázku a riešenie takto vytvoreného vzorca prikladám.
Nemáte oprávnění prohlížet přiložené soubory.

lubo.
Level 2
Level 2
Příspěvky: 180
Registrován: červen 13
Pohlaví: Nespecifikováno

Re: Část řetězce

Příspěvekod lubo. » 26 srp 2020 09:55

Napsal jsi co nejde. Pak jsi přidal 2 příklady.
Pokud to jsou všechny hledané signály, pak hledej řetězec. Pokud je toho více, tak napiš, jak poznáš, který kousek textu je ten pravý.

Petr__
nováček
Příspěvky: 13
Registrován: srpen 20
Pohlaví: Muž

Re: Část řetězce

Příspěvekod Petr__ » 26 srp 2020 10:58

Název signálu má pevnou strukturu: 8 znaků + podtržítko + označení signálu, které se liší.
Prefix bývá odlišný, suffix bývá odlišný.

MePExG
Level 2
Level 2
Příspěvky: 193
Registrován: srpen 16
Pohlaví: Muž

Re: Část řetězce

Příspěvekod MePExG » 26 srp 2020 11:13


Petr__
nováček
Příspěvky: 13
Registrován: srpen 20
Pohlaví: Muž

Re: Část řetězce

Příspěvekod Petr__ » 26 srp 2020 11:32

Může se stát, že prefix ani suffix signál neobsahuje vůbec a je čistý.

MePexG, částečně funguje, díky za něj! Nedaří se mi však sloupec vytvořit tak, abych mohl zdroj libovolně měnit. Musím mít pro každý zdroj sólo přednastavený sloupec. Narazil jsem i na zdroj, kdy mají některé hodnoty prefix i suffix a některé jsou čisté, tzn., že osekáním prefixu a suffixu konkrétních hodnot oddělovačem se mi pokrátí i čisté hodnoty, protože je v obou stejný oddělovač.

MePExG
Level 2
Level 2
Příspěvky: 193
Registrován: srpen 16
Pohlaví: Muž

Re: Část řetězce

Příspěvekod MePExG » 26 srp 2020 11:42

Stačí do príkladového stĺpca písať požadované hodnoty od tade, kde nevyhovujú požiadavkám šedé vypočítané hodnoty a vzorec sa postupne dopĺňa tak aby vyhovel všetkým Vašim potrebám. Zakaždým po zadaní hodnoty, stačí kontrolovať ďalšie šedé hodnoty a až keď je to OK, potvrdiť pridanie stĺpca.

lubo.
Level 2
Level 2
Příspěvky: 180
Registrován: červen 13
Pohlaví: Nespecifikováno

Re: Část řetězce  Vyřešeno

Příspěvekod lubo. » 26 srp 2020 14:40

Zkus funkci:

Kód: Vybrat vše

fnNajdiSignal
let
    Zdroj = (Signal as text) => let
   
        fnSignal = ( _ ) =>
        let
            xx = Splitter.SplitTextByDelimiter("_")( _ ),
            vysledek = List.Accumulate(xx, [stav = 0, sig = null],
                (state, _ ) =>
                let
                    Delka = Text.Length(_),
                    stav =
                        if state[stav] = 0 and Delka = 8 then 1
                        else if state[stav] = 1 and Delka > 0 then 2
                        else if state[stav] = 2 then 2
                        else 0,
                    sig =
                        if state[stav] = 0 and Delka = 8 then _
                        else if state[stav] = 1 and Delka > 0 then state[sig] & "_" & _ 
                        else if state[stav] = 2 then state[sig]
                        else null
                in [stav = stav, sig = sig]   
            ),
            jmeno = if vysledek[stav] = 2 then vysledek[sig] else null
        in jmeno,
   
        kousky = Splitter.SplitTextByDelimiter(".")(Signal),
        AsiSignal = List.Select(kousky, each Text.Contains(_, "_")),
   
        seznam = List.RemoveNulls(List.Transform(AsiSignal, fnSignal)),
        jmenoSignalu = seznam{0}
    in
        jmenoSignalu
in
    Zdroj



ještě dotaz, který z parametru extrahuje jméno (může se hodit)

Kód: Vybrat vše

let

    fnSignal = ( _ ) =>
    let
        xx = Splitter.SplitTextByDelimiter("_")( _ ),
        vysledek = List.Accumulate(xx, [stav = 0, sig = null],
            (state, _ ) =>
            let
                Delka = Text.Length(_),
                stav =
                    if state[stav] = 0 and Delka = 8 then 1
                    else if state[stav] = 1 and Delka > 0 then 2
                    else if state[stav] = 2 then 2
                    else 0,
                sig =
                    if state[stav] = 0 and Delka = 8 then _
                    else if state[stav] = 1 and Delka > 0 then state[sig] & "_" & _ 
                    else if state[stav] = 2 then state[sig]
                    else null
            in [stav = stav, sig = sig]   
        ),
        jmeno = if vysledek[stav] = 2 then vysledek[sig] else null
    in jmeno,

    kousky = Splitter.SplitTextByDelimiter(".")(Signal),
    AsiSignal = List.Select(kousky, each Text.Contains(_, "_")),

    seznam = List.RemoveNulls(List.Transform(AsiSignal, fnSignal)),
    jmenoSignalu = seznam{0}
in
    jmenoSignalu


Případné další testy si dopiš.

Petr__
nováček
Příspěvky: 13
Registrován: srpen 20
Pohlaví: Muž

Re: Část řetězce

Příspěvekod Petr__ » 27 srp 2020 10:53

Super, funguje to. Díky moc!


Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 2 hosti