< návrat zpět

MS Excel


Téma: Power Query - poslední hodnota rss

Zaslal/a 27.10.2022 23:35

ahojte, opět potřebuji vaši pomoc. Pomalu se učím úplné základy power query a už jsem ze svých souborů dostal hodně. Jednu z posledních věcí, které potřebuju dostat je: v textových souborech jsou na řádcích datumy a já bych potřeboval z posledního datumu dostat hodnotu teploty vlhkosti (nemusí to být maximální/minimální hodnota). Vzorové power query s TXT souborama v příloze. Pomůže někdo?

Díky,
Dalibor

Příloha: zip53735_test2.zip (122kB, staženo 9x)
Zaslat odpověď >

Strana:  « předchozí  1 2 3
#053759
avatar
Možná jiná forma zápisu by mohla být čitelnější?

Tohle je načtení jednoho souboru a výpočet příslušné statistiky.
(Zadání je pro mne docela zmatečné, tak jen co je v přikladu nebo v poznámkách.)


// Statistika (funkce)
(Soubor as binary) =>
let
// Načtení dat
Zdroj = Lines.FromBinary(Soubor, null, false,1250),
DataTabulky = List.RemoveLastN(List.RemoveFirstN(Zdroj, each not Text.StartsWith(_, "Date") ), each not Text.StartsWith(_, ">") ),
#"Převedené na tabulku" = Table.FromList({"> " & DataTabulky{0} } & List.Range(DataTabulky,1), Splitter.SplitByNothing(), null, null, ExtraValues.Ignore),
#"Rozdělit sloupec oddělovačem" = Table.SplitColumn(#"Převedené na tabulku", "Column1", Splitter.SplitTextByWhitespace(QuoteStyle.Csv)),
#"Záhlaví se zvýšenou úrovní" = Table.PromoteHeaders(#"Rozdělit sloupec oddělovačem", [PromoteAllScalars=true]),
#"Změněný typ s národním prostředím" = Table.TransformColumnTypes(#"Záhlaví se zvýšenou úrovní", {{"T_Set", type number}, {"T_Rec", type number}, {"HR_Rec", type number}, {"HR_Set", type number}}, "en-US"),
#"Změněný typ" = Table.TransformColumnTypes(#"Změněný typ s národním prostředím",{{"Date", type date}, {"Hour", type time}}),
tab = Table.Buffer(Table.ReplaceValue(#"Změněný typ", each [Date], each [Date] & [Hour],Replacer.ReplaceValue,{"Date"})),
//
// Počítání statistiky (do recordu, pak se to spojí do tabulky)
posledniRadek = Table.Last(tab),
Stat = [
Začátek předehřevu = tab[Date]{0},
// Konec předehřevu = List.Max(tab[Date]),
Konec předehřevu = posledniRadek[Date],
Teplota nastavená = tab[T_Set]{0},
Teplota MIN = List.Min(tab[T_Rec]),
Teplota MAX = List.Max(tab[T_Rec]),

Vlhkost nastavená = tab[HR_Set]{0},
Vlhkost MIN = List.Min(tab[HR_Rec]),
Vlhkost MAX = List.Max(tab[HR_Rec]),

// Teplota in spec start = List.Min(Table.SelectRows(tab[[Date], [T_Rec]], each [T_Rec] >= #"Teplota nastavená" - 5)[Date]),
lim = #"Teplota nastavená" - 5,
Teplota in spec start = List.Min(Table.SelectRows(tab, each [T_Rec] >= lim)[Date]),
Total time = #"Konec předehřevu" - #"Začátek předehřevu",
Time in Spec = #"Konec předehřevu" - #"Teplota in spec start",
Náběh teploty = #"Teplota in spec start" - #"Začátek předehřevu",
Poslední teplota = posledniRadek[T_Rec],
Poslední vlhkost = posledniRadek[HR_Rec],
Počet záznamů v TXT = Table.RowCount(tab), // Co má být velikost??? záznamy, pokud byte, tak je to v info o souboru
Poslední datum = DateTime.Date(#"Konec předehřevu")
]
in
Stat


Všechny soubory se pak vyhodnotí normálně:

let
Zdroj = Folder.Files(Excel.CurrentWorkbook(){[Name="tblCesta"]}[Content]{0}[Cesta]),
#"Filtrované řádky" = Table.SelectRows(Zdroj, each [Extension] = ".TXT" and not Text.Contains([Name], "Default") and [Attributes][Hidden] <> true),
#"Rozdělit sloupec oddělovačem" = Table.SplitColumn(#"Filtrované řádky", "Name", each List.Select(Splitter.SplitTextByAnyDelimiter({" ","-", "_", "."}, QuoteStyle.Csv, false)(_), (l) => l <> ""), {"pref.1", "pref.2","Předehřev", "Name.2", "Nastavený čas", "Batch"}),
#"Odebrané sloupce" = Table.SelectColumns(#"Rozdělit sloupec oddělovačem",{"Content", "Batch", "Předehřev", "Nastavený čas", "Date modified"}),
#"Přejmenované sloupce" = Table.RenameColumns(#"Odebrané sloupce",{{"Date modified", "Datum modifikace"}}),
//
// Přidaná statistika suoboru
#"Statistika souboru" = Table.TransformColumns(#"Přejmenované sloupce",{{"Content", Statistika}}),
#"Rozbalené Content" = Table.ExpandRecordColumn(#"Statistika souboru", "Content", {"Začátek předehřevu", "Konec předehřevu", "Teplota nastavená", "Teplota MIN", "Teplota MAX", "Vlhkost nastavená", "Vlhkost MIN", "Vlhkost MAX", "Teplota in spec start", "Total time", "Time in Spec", "Náběh teploty", "Poslední teplota", "Poslední vlhkost", "Počet záznamů v TXT", "Poslední datum"}),
#"Odebrané ostatní sloupce" = Table.SelectColumns(#"Rozbalené Content",{"Batch", "Předehřev", "Nastavený čas", "Datum modifikace", "Začátek předehřevu", "Konec předehřevu", "Teplota nastavená", "Teplota MIN", "Teplota MAX", "Vlhkost nastavená", "Vlhkost MIN", "Vlhkost MAX", "Teplota in spec start", "Total time", "Time in Spec", "Náběh teploty", "Poslední teplota", "Poslední vlhkost", "Počet záznamů v TXT", "Poslední datum"}),
// tohle je navíc, v excelu je to triviální vzorec
#"Přidaný sloupec" = Table.AddColumn(#"Odebrané ostatní sloupce", "Pravda/Nepravda", each DateTime.Date([Datum modifikace]) = [Poslední datum], type logical),
#"Změněný typ" = Table.TransformColumnTypes(#"Přidaný sloupec",{{"Začátek předehřevu", type datetime}, {"Konec předehřevu", type datetime}, {"Teplota nastavená", type number}, {"Teplota MIN", type number}, {"Teplota MAX", type number}, {"Vlhkost nastavená", type number}, {"Vlhkost MAX", type number}, {"Vlhkost MIN", type number}})
in
#"Změněný typ"
citovat
#053762
elninoslov
@lubo: čas som nameral na rovnakej vzorke súborov 229 s (00:03:49). Vedel by ste ako identifikovať súbory, pri ktorých niekde nastane chyba prevodu na číslo?

@jaks.dalibor: Skutočne potrebujete načítať až toľko súborov? Nemôžete ich trochu eliminovať, napr. dátumom?

Ako pretransformovať funkciu na dotaz a naopak ...
No to je ťažké Vám vysvetliť, keď neviete, čo je funkcia. Funkcia sa používa na vrátenie nejakého výsledku (ale nemusí to tak byť vždy). Opakovane, na väčší počet zmien parametrov. A to je to. Do funkcie (väčšinou) vstupuje nejaký parameter, ktorý sa mení, funkcia vyráta čo má, a vráti adekvátny výsledok. V tomto prípade ako parameter funkcie je súbor, a funkcia vráti jeho hodnoty. Teda nemôžete spustiť funkciu bez parametru. To je presný opak dotazu (teraz vynecháme úvahy o inom druhu parametrov vstupujúcich aj do dotazu napr. v tomto príklade Cesta z pomocnej Tabuľky, nazvime ich radšej premenné), do ktorého nevstupujú parametre ako do funkcie. Teda Vy keď chcete urobiť nejakú funkciu na načítanie údajov zo súborov, urobíte si najskôr normálny dotaz, kde si do premennej dáte pevnú cestu k jednému súboru, nastavíte potrebné kroky, ktoré vidíte čo robia. Keď je to funkčné, zmeníte dotaz na funkciu, stačí napísať na začiatok dotazu
(NázovParametru as TypParametru) =>
a nahradiť ten predtým pevne stanovený skúšobný súbor tým parametrom. A máte z dotazu funkciu z ktorej dostanete výsledok ak ju zavoláte
NázovFunkcie(NázovParametru)
Ale funkciu už nemôžete krokovať - ona je krok v obslužnom dotaze. Takže, ak ju chcete upraviť a krokovať, tak si vytvorte prázdny dotaz, vložte tam kód funkcie, odstráňte
(NázovParametru as TypParametru) =>
a zmeňte ten variabilný NázovParametru na pevný súbor. Lenže tu sa treba zamyslieť nad tým typom parametru. V tomto prípade do funkcie vstupuje parameter typu Binary teda Content - obsah súboru, nie iba názov súboru. Takže ten parameter NázovParametru vymeníte za niečo čo urobí obsah (Content) toho súboru teda
File.Contents("E:\Download\test2\PRE_9-A _02_024_22A221011.TXT")

Je to proste ťažké vysvetliť, keď nepoznáte rozdiel medzi dotazom a funkciou či procedúrou a funkciou, a ako v nich pracujú parametre/premenné.citovat
#053763
avatar
@elninoslov

Čas odpovídá. Hlavní činností je načítání dat.

Tady se každý soubor načítá minimálně 2x. Neměřil jsem to, není to kritické. (V jiném případě jsem viděl i 10 čtení.) Dá se to zrychlit, ale za cenu složitějšího kódu.

Obvykle dávám přednost kratšímu kódu s jednodušší údržbou a čas řeším, až když to trvá opravdu dlouho (např. soubor má několik mil. řádků).citovat
#053764
avatar
chlapi, rychlost čtení, resp. celková délka není asi až tak limitující. Elni mi už kdysi (tak půl roku zpátky) upravil soubor pro autoklávy, kde ve finále zpracoval data z 26tis souborů za 45 minut!!!, ale výsledek určitě stojí za to. Bohužel potřebuju zpracovat zhruba 75 tis souborů, protože to bude sloužit jako podklad pro nové parametry pro nový software. A taky mi to možná zachrání flek, bo někdo na mě něco hodil, co není pravda. Elni, jako co je funkce chápu, ale v tomto případě (PQ) jsem nechápal, co je ten parametr. Teď už je mi to trochu jasnější.citovat

Strana:  « předchozí  1 2 3

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje