From 10706536792e8e49f3a219ca2b684f2eaa40f2b9 Mon Sep 17 00:00:00 2001 From: DaTekShaman Date: Thu, 16 Apr 2026 16:35:03 +0300 Subject: [PATCH] Add new Power Query functions and update settings for improved data handling --- .vscode/settings.json | 5 +++++ power-query/fFixCSVDates.m | 20 ++++++++++++++++++ power-query/fFixCSVNumbers | 19 +++++++++++++++++ power-query/fIfBlank | 0 power-query/fIfBlank.m | 7 +++++++ power-query/specific/fDummyTable.m | 8 +++++++ power-query/specific/fGetNeededColumnNames.m | 5 +++++ power-query/specific/fNormalizeColumnNames.m | 22 ++++++++++++++++++++ power-query/specific/fNormalizeMalfCode.m | 9 ++++++++ power-query/specific/fNormalizeSKU.m | 10 +++++++++ power-query/specific/fNormalizeSN.m | 9 ++++++++ 11 files changed, 114 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 power-query/fFixCSVDates.m create mode 100644 power-query/fFixCSVNumbers delete mode 100644 power-query/fIfBlank create mode 100644 power-query/fIfBlank.m create mode 100644 power-query/specific/fDummyTable.m create mode 100644 power-query/specific/fGetNeededColumnNames.m create mode 100644 power-query/specific/fNormalizeColumnNames.m create mode 100644 power-query/specific/fNormalizeMalfCode.m create mode 100644 power-query/specific/fNormalizeSKU.m create mode 100644 power-query/specific/fNormalizeSN.m diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f773aa4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "powerquery.client.additionalSymbolsDirectories": [ + "d:/Onedrive/Projects/Own Code/spqr/.vscode/excel-pq-symbols" + ] +} \ No newline at end of file diff --git a/power-query/fFixCSVDates.m b/power-query/fFixCSVDates.m new file mode 100644 index 0000000..c6293d5 --- /dev/null +++ b/power-query/fFixCSVDates.m @@ -0,0 +1,20 @@ +let + Func = (SourceText as nullable text) as date => + let + CheckSlashes = Text.Contains(SourceText, "/"), + TryToConvert = if CheckSlashes then + let + SplitText = Text.Split(SourceText, "/"), + Parse = try Date.From(#date(Number.From(SplitText{2}), + Number.From(SplitText{0}), + Number.From(SplitText{1}) + ) ) + otherwise null + in + Parse + else + Date.From(SourceText) + in + TryToConvert +in + Func \ No newline at end of file diff --git a/power-query/fFixCSVNumbers b/power-query/fFixCSVNumbers new file mode 100644 index 0000000..cac382a --- /dev/null +++ b/power-query/fFixCSVNumbers @@ -0,0 +1,19 @@ +let + Func = (TableOrText as any, optional ColumnsList as list) => let + ChooseMethod = try List.IsEmpty(ColumnsList) otherwise true, + ApplyMethod = if ChooseMethod then + let + ColonToNull = Text.Replace(TableOrText, ",", ""), + DotToColon = Text.Replace(ColonToNull, ".", "") + in + DotToColon + else + let + ColonToNull = Table.ReplaceValue(TableOrText, ",", "" , Replacer.ReplaceText, ColumnsList), + DotToColon = Table.ReplaceValue(ColonToNull, ".", ",", Replacer.ReplaceText, ColumnsList) + in + DotToColon + in + ApplyMethod +in + Func \ No newline at end of file diff --git a/power-query/fIfBlank b/power-query/fIfBlank deleted file mode 100644 index e69de29..0000000 diff --git a/power-query/fIfBlank.m b/power-query/fIfBlank.m new file mode 100644 index 0000000..773c033 --- /dev/null +++ b/power-query/fIfBlank.m @@ -0,0 +1,7 @@ +let + GetData = (P_PRIMARY as nullable text, P_SECONDARY as nullable text) => let + Makechoice = if P_PRIMARY is null then P_SECONDARY else P_PRIMARY + in + Makechoice +in + GetData \ No newline at end of file diff --git a/power-query/specific/fDummyTable.m b/power-query/specific/fDummyTable.m new file mode 100644 index 0000000..b2104a6 --- /dev/null +++ b/power-query/specific/fDummyTable.m @@ -0,0 +1,8 @@ +(optional LST_DUMMY_DATA as nullable list, + optional LST_COLUMNS as nullable list) as table => + let + DummyColumns = if LST_COLUMNS = null then LST_DUMMY_DATA else LST_COLUMNS, + DummyData = if LST_DUMMY_DATA = null then List.Repeat({null}, List.Count(DummyColumns)) else LST_DUMMY_DATA, + Dummy = #table(DummyColumns, {DummyData}) + in + Dummy \ No newline at end of file diff --git a/power-query/specific/fGetNeededColumnNames.m b/power-query/specific/fGetNeededColumnNames.m new file mode 100644 index 0000000..e676eef --- /dev/null +++ b/power-query/specific/fGetNeededColumnNames.m @@ -0,0 +1,5 @@ +(optional S_RENAME_TAG as text) as list => + let + ColumnsToKeep = Table.Distinct(Table.SelectColumns(Table.SelectRows(fP("RENAMING_RULES"), each ([#"#"] = S_RENAME_TAG)),{"НОВЫЙ"}))[НОВЫЙ] + in + ColumnsToKeep \ No newline at end of file diff --git a/power-query/specific/fNormalizeColumnNames.m b/power-query/specific/fNormalizeColumnNames.m new file mode 100644 index 0000000..bb44c60 --- /dev/null +++ b/power-query/specific/fNormalizeColumnNames.m @@ -0,0 +1,22 @@ +( TBL_SOURCE as table, + optional S_RENAME_TAG as nullable text, + optional B_DO_RENAME as nullable logical) as table => + let + RenamingNeeded = if B_DO_RENAME = null then true else B_DO_RENAME, + RenameTag = if S_RENAME_TAG = null then "" else S_RENAME_TAG, + + InitialColumnNames = Table.ColumnNames(TBL_SOURCE), + RenameTableColumns = if RenamingNeeded then + let + NewColumnNames = List.Transform(InitialColumnNames, each fReplaceFunction(_, true, S_RENAME_TAG)), + RenameColumns = Table.RenameColumns(TBL_SOURCE, + List.Zip({InitialColumnNames, NewColumnNames})) + in + RenameColumns + else + TBL_SOURCE, + + ColumnsToKeep = fGetNeededColumnNames(RenameTag), + KeepNeeded = Table.SelectColumns(RenameTableColumns, ColumnsToKeep, MissingField.Ignore) + in + KeepNeeded \ No newline at end of file diff --git a/power-query/specific/fNormalizeMalfCode.m b/power-query/specific/fNormalizeMalfCode.m new file mode 100644 index 0000000..7c4c191 --- /dev/null +++ b/power-query/specific/fNormalizeMalfCode.m @@ -0,0 +1,9 @@ +let + Source = (anyCode as nullable any) as text => let + TrimCode = try Text.Trim(Text.From(anyCode)) otherwise "PARSE-ERROR", + MarkNulls = if (TrimCode = null) or (TrimCode = "") or (TrimCode = "0") then "NOT-PROVIDED" else TrimCode, + Normalize = try Text.Upper(MarkNulls) otherwise "PARSE-ERROR" + in + Normalize +in + Source \ No newline at end of file diff --git a/power-query/specific/fNormalizeSKU.m b/power-query/specific/fNormalizeSKU.m new file mode 100644 index 0000000..a5653d1 --- /dev/null +++ b/power-query/specific/fNormalizeSKU.m @@ -0,0 +1,10 @@ +let + Source = (anySKU as any) as number => let + RemoveFullStop = Text.Replace(Text.From(anySKU), ".", ""), + TrimSKU = Text.Trim(RemoveFullStop), + MarkNulls = if (TrimSKU = null) or (TrimSKU = "") or (TrimSKU = "0") then -36001 else TrimSKU, + Normalize = try Number.From(MarkNulls) otherwise -36002 + in + Normalize +in + Source \ No newline at end of file diff --git a/power-query/specific/fNormalizeSN.m b/power-query/specific/fNormalizeSN.m new file mode 100644 index 0000000..6c97f31 --- /dev/null +++ b/power-query/specific/fNormalizeSN.m @@ -0,0 +1,9 @@ +let + Source = (anySN as nullable any) as text => let + TrimSN = try Text.Trim(Text.From(anySN)) otherwise "-36002", + MarkNulls = if (TrimSN = null) or (TrimSN = "") or (TrimSN = "0") then "-36001" else TrimSN, + Normalize = try Text.Upper(MarkNulls) otherwise "-36002" + in + Normalize +in + Source \ No newline at end of file