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 (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!