Skip to content

Instantly share code, notes, and snippets.

View m-dekorte's full-sized avatar

Melissa de Korte m-dekorte

View GitHub Profile
@m-dekorte
m-dekorte / textTrim.pq
Created September 28, 2025 12:23
textTrim M function | Normalize whitespace and punctuation spacing in strings.
let
fxTrim = (string as nullable text, optional addPunctuationMarks as text) as text =>
[
baseMarks = ".,;:?!'-–—_",
marks = Text.ToList(baseMarks & (addPunctuationMarks ?? "")),
clean = Text.Combine(
List.Transform(
Splitter.SplitTextByCharacterTransition(each true, marks)(string),
Text.Trim
)
@m-dekorte
m-dekorte / ExploreTransformColumnTypes.pq
Last active September 12, 2025 15:02
Explore 'Table.TransformColumnTypes' in Power Query M with the optional third parameter now also accepting a Record with Culture and/or MissingField.
let
/* The July 2025 update to the documentation now mentions a MissingField type for Table.TransformColumnTypes */
/* Here's sample data, a table with two columns: Date and Value */
Source = #table(
type table [Date = date, Value = number],
{
{#date(2024, 3, 12), 0.24368},
{#date(2024, 5, 30), 0.03556},
{#date(2023, 12, 14), 0.3834}
}
@m-dekorte
m-dekorte / ExploreFieldAccess.pq
Created September 1, 2025 13:25
Explore 'Field Access' in Power Query M from the strict 'Required' to the safer 'Optional' method.
let
/* Samples */
myRecord = [#"1"=1, Two=2],
myTable = Table.FromColumns({{0..2}, {3..5}}),
/* Record | Field Selection or Lookup */
RecRequiredFieldAccess = [#"1"=1, Two=2][Two],
RecRequiredFieldAccess2 = [#"1"=1, Two=2][Beep],
RecOptionalFieldAccess = [#"1"=1, Two=2][Beep]?,
@m-dekorte
m-dekorte / ExploreItemAccess.pq
Created August 25, 2025 16:11
Explore 'Item Access' in Power Query M from the strict 'Required' to the safer 'Optional' method.
let
/* Samples */
myList = {0..4},
myTable = Table.FromValue({0..4}),
/* List | Item Access */
ListRequiredItemAccess = {0..4}{1},
ListRequiredItemAccess2 = {0..4}{10},
ListOptionalItemAccess = {0..4}{10}?,
@m-dekorte
m-dekorte / findMinMaxDates.pq
Last active August 16, 2025 14:06
findMinMaxDates M function | Find the Min and Max dates across multiple queries and/ or columns, for example to set up a dynamic date table. This method leverages the Table.Profile function and handles known limitations such as null and/ or inconsistent/ missing column types.
let
fxFindMinMaxDates = (tableNames as list, optional dateColsID as text, optional excludeDateColNames as list) as record =>
let
selectedTables = Record.SelectFields(
#sections[Section1],
tableNames,
MissingField.Ignore
),
rawData = Table.RemoveColumns(
Table.Combine(Record.ToList(selectedTables)),
@m-dekorte
m-dekorte / extractEightDigitSequence.pq
Last active June 11, 2025 12:52
extractEightDigitSequence M function | Extract only 8 digit sequences such as a date tag from a string.
let
fxExtractEightDigitSequence = let
extractEightDigitSequence = (txt as nullable text, optional Occurrence as number) =>
let
input = txt ?? "",
parts = Text.SplitAny(input, Text.Remove(input, {"0" .. "9"})),
digits = List.Select(parts, each Text.Length(_) = 8)
in
{List.First(digits), List.Last(digits), digits}{(Occurrence ?? 0)},
extractEightDigitSequenceType = type function (
@m-dekorte
m-dekorte / extractCharactersByCase.pq
Created April 20, 2025 12:32
extractCharactersByCase M function | Extract only letters of a specified case. Non‑letter characters (digits, punctuation, whitespace) are dropped.
let
extractCharactersByCase = (input as nullable text, optional caseType as text) as text =>
Text.Combine(
List.Select(
Text.ToList(input ?? ""),
(s) =>
if Text.Proper(caseType ?? "Upper") = "Upper"
then not (Text.Lower(s) = s)
else not (Text.Upper(s) = s)
)
@m-dekorte
m-dekorte / extendedDateTable.cs
Created March 11, 2025 11:34
Extended Date table C# script | Compatible with Tabular Editor versions TE2 and TE3
var dateTableName = "Dates"; // Name of your date table
var dateKeyColName = "Date"; // Name of the date key column in the table
var colOperations = new List<Tuple<string, string, bool>>(){
Tuple.Create("Quarter & Year", "QuarternYear", true),
Tuple.Create("Month & Year", "MonthnYear", true),
Tuple.Create("Month Name", "MonthOfYear", true),
Tuple.Create("Month Short", "MonthOfYear", true),
Tuple.Create("Month Initial", "MonthOfYear", true),
Tuple.Create("Week & Year", "WeeknYear", true),
Tuple.Create("Day of Week Name", "DayOfWeek", true),
@m-dekorte
m-dekorte / extendedDateTable.pq
Last active October 29, 2025 07:14
Extended Date table M function | Creates an ISO-8601 type calendar
let
fnDateTable = ( StartDate as date, EndDate as date, optional FYStartMonthNum as number, optional Holidays as list, optional WDStartNum as number, optional AddRelativeNetWorkdays as logical ) as table =>
let
FYStartMonth = List.Select({1..12}, each _ = FYStartMonthNum){0}? ?? 1,
WDStart = List.Select({0..1}, each _ = WDStartNum){0}? ?? 0,
CurrentDate = Date.From(DateTimeZone.FixedUtcNow()),
DayCount = Duration.Days(Duration.From(EndDate - StartDate)) + 1,
weekStart = Day.Monday,
HolidaysProvided = Holidays <> null,
@m-dekorte
m-dekorte / convertDateTo.pq
Last active June 11, 2025 10:01
convertDateTo* M function | Convert an input value like a date, datetime, datetimezone or text to a target type.
let
/* Function to convert an input value like a date, datetime, datetimezone, or text to a target type */
convertDateTo = let
fxConvertDateTo = (Value as any, ReturnType as text, optional Culture as any, optional formatString as text) as any =>
let
Separators = Text.Combine(List.Select(
Text.ToList(Text.Remove(Text.From(Value) ?? "", {"0" .. "9"})),
each Text.Lower(_) = Text.Upper(_) )
),
c = Culture ?? Culture.Current,