Stránka 1 z 1

Část řetězce

Napsal: 25 srp 2020 10:20
od Petr__
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.

Re: Část řetězce

Napsal: 25 srp 2020 13:07
od ITCrowd
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
vysledek.png (1.63 KiB) Zobrazeno 5537 x

Jak si analogicky změnit druhou podmínku, na to jistě už přijdeš sám.

Re: Část řetězce

Napsal: 25 srp 2020 20:40
od MePExG
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.

Re: Část řetězce

Napsal: 26 srp 2020 09:55
od lubo.
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ý.

Re: Část řetězce

Napsal: 26 srp 2020 10:58
od Petr__
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ý.

Re: Část řetězce

Napsal: 26 srp 2020 11:13
od MePExG

Re: Část řetězce

Napsal: 26 srp 2020 11:32
od Petr__
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č.

Re: Část řetězce

Napsal: 26 srp 2020 11:42
od MePExG
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.

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

Napsal: 26 srp 2020 14:40
od lubo.
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š.

Re: Část řetězce

Napsal: 27 srp 2020 10:53
od Petr__
Super, funguje to. Díky moc!