Forum Discussion
ngct1112
6 years agoPost Patron
Regex for subtracting texts by Power Query/ Dax
Hi, I would like to extract some data from a column which the input of the data are not consistant. May I know is there any way I could clean the data by PowerQuery or DAX. Thanks Column Result...
- 6 years ago
Hi ngct1112 ,
please paste this code into the advanced editor and follow the steps:
let Source = Table.FromRows( Json.Document( Binary.Decompress( Binary.FromText( "i45Wcs7PKc3NU9JRCkotLs0pUYrViVYyzE4HCoBIEC8xKdnQACJiABXC4FtkpytkZGSYgAQtoIKOSclW6ApNE7PTExOTjMGipggLFHQVDE0hSmGiEDXGUJ4lmGcJ5YWFATWkpStYgEVhFmZnKwA1KxgYIBtuYGD4qGGZHtAOPT2gGJANk4wFAA==", BinaryEncoding.Base64 ), Compression.Deflate ) ), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table[Column1 = _t, Column2 = _t] ), #"Duplicated Column" = Table.DuplicateColumn(Source, "Column1", "Column1 - Copy"), #"Changed Type" = Table.TransformColumnTypes( #"Duplicated Column", {{"Column1", type text}, {"Column2", type text}} ), #"Promoted Headers" = Table.PromoteHeaders(#"Changed Type", [PromoteAllScalars = true]), #"Added Index" = Table.AddIndexColumn(#"Promoted Headers", "Index", 0, 1), #"Changed Type1" = Table.TransformColumnTypes( #"Added Index", {{"Column", type text}, {"Result", type text}} ), #"Split Column by Character Transition" = Table.SplitColumn( #"Changed Type1", "Column", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"Column.1", "Column.2", "Column.3"} ), GetSplittedValues = Table.AddColumn( #"Split Column by Character Transition", "SplittedValues", each Record.FieldValues( Record.SelectFields( _, List.Difference(Record.FieldNames(_), Table.ColumnNames(#"Changed Type1")) ) ) ), #"Expanded SplittedValues" = Table.ExpandListColumn(GetSplittedValues, "SplittedValues"), #"Extracted Text Before Delimiter" = Table.TransformColumns( #"Expanded SplittedValues", {{"SplittedValues", each Text.BeforeDelimiter(_, " "), type text}} ), FilterOnlyRowsWithNumbers = Table.SelectRows( #"Extracted Text Before Delimiter", each (List.Contains({"1".."9"}, Text.Start([SplittedValues], 1))) ), FilterOnlyRowsWithKg = Table.SelectRows( FilterOnlyRowsWithNumbers, each Text.Contains([SplittedValues], "kg", Comparer.OrdinalIgnoreCase) ), #"Added Custom1" = Table.AddColumn( FilterOnlyRowsWithKg, "Custom", each try Number.From(Text.BeforeDelimiter([SplittedValues], "kg")) otherwise null ), #"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([Custom] <> null)), #"Added Suffix" = Table.TransformColumns( #"Filtered Rows", {{"Custom", each Text.From(_, "en-GB") & "kg", type text}} ), #"Removed Other Columns" = Table.SelectColumns( #"Added Suffix", {"Column_1", "Result", "Custom"} ) in #"Removed Other Columns" - 5 years ago
the real power of PQ + RegEx
let RE = (regex as text, str as text) => let html = "<script>var regex = " & regex & "; var str = """ & str & """; var res = str.match(regex); document.write(res)</script>", res = Web.Page(html)[Data]{0}[Children]{0}[Children]{1}[Text]{0} in res, Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMsxOV4rViVZKTEo2NICyDQ28oQyL7HSFjIwMEzDPMSnZCq7GNDE7PTExyRihXUFXwdAUyjX2dgfTltkQOiwMKJuWrmABlc/OVgAqVTAwgHANDAwfNSzTAxqipwcUB7KVYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column = _t]), #"Added Custom" = Table.AddColumn(Source, "Custom", each RE("/\d+kg/gi", [Column])) in #"Added Custom"
amitchandak
6 years agoSuper User
ImkeF , can help on this ?
ImkeF
6 years agoCommunity Champion
Hi ngct1112 ,
please paste this code into the advanced editor and follow the steps:
let
Source = Table.FromRows(
Json.Document(
Binary.Decompress(
Binary.FromText(
"i45Wcs7PKc3NU9JRCkotLs0pUYrViVYyzE4HCoBIEC8xKdnQACJiABXC4FtkpytkZGSYgAQtoIKOSclW6ApNE7PTExOTjMGipggLFHQVDE0hSmGiEDXGUJ4lmGcJ5YWFATWkpStYgEVhFmZnKwA1KxgYIBtuYGD4qGGZHtAOPT2gGJANk4wFAA==",
BinaryEncoding.Base64
),
Compression.Deflate
)
),
let
_t = ((type nullable text) meta [Serialized.Text = true])
in
type table[Column1 = _t, Column2 = _t]
),
#"Duplicated Column" = Table.DuplicateColumn(Source, "Column1", "Column1 - Copy"),
#"Changed Type" = Table.TransformColumnTypes(
#"Duplicated Column",
{{"Column1", type text}, {"Column2", type text}}
),
#"Promoted Headers" = Table.PromoteHeaders(#"Changed Type", [PromoteAllScalars = true]),
#"Added Index" = Table.AddIndexColumn(#"Promoted Headers", "Index", 0, 1),
#"Changed Type1" = Table.TransformColumnTypes(
#"Added Index",
{{"Column", type text}, {"Result", type text}}
),
#"Split Column by Character Transition" = Table.SplitColumn(
#"Changed Type1",
"Column",
Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}),
{"Column.1", "Column.2", "Column.3"}
),
GetSplittedValues = Table.AddColumn(
#"Split Column by Character Transition",
"SplittedValues",
each Record.FieldValues(
Record.SelectFields(
_,
List.Difference(Record.FieldNames(_), Table.ColumnNames(#"Changed Type1"))
)
)
),
#"Expanded SplittedValues" = Table.ExpandListColumn(GetSplittedValues, "SplittedValues"),
#"Extracted Text Before Delimiter" = Table.TransformColumns(
#"Expanded SplittedValues",
{{"SplittedValues", each Text.BeforeDelimiter(_, " "), type text}}
),
FilterOnlyRowsWithNumbers = Table.SelectRows(
#"Extracted Text Before Delimiter",
each (List.Contains({"1".."9"}, Text.Start([SplittedValues], 1)))
),
FilterOnlyRowsWithKg = Table.SelectRows(
FilterOnlyRowsWithNumbers,
each Text.Contains([SplittedValues], "kg", Comparer.OrdinalIgnoreCase)
),
#"Added Custom1" = Table.AddColumn(
FilterOnlyRowsWithKg,
"Custom",
each try Number.From(Text.BeforeDelimiter([SplittedValues], "kg")) otherwise null
),
#"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([Custom] <> null)),
#"Added Suffix" = Table.TransformColumns(
#"Filtered Rows",
{{"Custom", each Text.From(_, "en-GB") & "kg", type text}}
),
#"Removed Other Columns" = Table.SelectColumns(
#"Added Suffix",
{"Column_1", "Result", "Custom"}
)
in
#"Removed Other Columns"