Forum Discussion
Anonymous
7 years agoNot applicable
Change Column Headers To Names Dynamically Nested in Column_1 by Column Count
After the source is loaded into Power Bi - Power Query I tab delimit the column which will create 22 columns. The fields in column_1, under "~Curve Information", all the way to the blank field (Rows...
- 7 years ago
Ok, so this works:
let Source = Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\MyComputer\Desktop\Example Log.las"), null, null, 1252)}), #"Added Custom" = Table.AddColumn(Source, "curveFinder", each if Text.Contains([Column1], "~CURVE INFORMATION") then "COLUMNS" else if Text.Contains([Column1], "~ASCII DATA AREA") then "DATA" else null), #"Filled Down" = Table.FillDown(#"Added Custom",{"curveFinder"}), columnNames = let #"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([curveFinder] = "COLUMNS")), #"Removed Top Rows" = Table.Skip(#"Filtered Rows",1), #"Removed Bottom Rows" = Table.RemoveLastN(#"Removed Top Rows",1), #"Removed Other Columns" = Table.RemoveColumns(#"Removed Bottom Rows",{"curveFinder"}), #"Extracted Text After Delimiter" = Table.TransformColumns(#"Removed Other Columns", {{"Column1", each Text.AfterDelimiter(_, " . "), type text}}), #"Trimmed Text" = Table.TransformColumns(#"Extracted Text After Delimiter",{{"Column1", Text.Trim, type text}}), #"Cleaned Text" = Table.TransformColumns(#"Trimmed Text",{{"Column1", Text.Clean, type text}}), #"Replaced Value" = Table.ReplaceValue(#"Cleaned Text"," ","",Replacer.ReplaceText,{"Column1"}), Custom1 = #"Replaced Value"[Column1] in Custom1, data = let #"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([curveFinder] = "DATA")), #"Removed Top Rows" = Table.Skip(#"Filtered Rows",1), #"Removed Columns" = Table.RemoveColumns(#"Removed Top Rows",{"curveFinder"}), #"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns", "Column1", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), columnNames) in #"Split Column by Delimiter" in dataI've tested this on your log file, which contains 22 columns. I also incrementally deleted column names and corresponding data columns as part of my tests. It passed those tests.
While this may work now, it is very brittle and makes a TON of assumptions about the structure of your data in the future. Most important assumptions:
- Column names will always fall under '~CURVE INFORMATION' and the data will always fall under '~ASCII DATA AREA'
- There will always be a space between the last column name and '~ASCII DATA AREA'
- Column names will always be after this delimiter: ' . '
- The data values will always be delimited by a space (' ')
I hope this helps.
tonmcg
Resolver II
7 years agoOk, so this works:
let
Source = Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\MyComputer\Desktop\Example Log.las"), null, null, 1252)}),
#"Added Custom" = Table.AddColumn(Source, "curveFinder", each if Text.Contains([Column1], "~CURVE INFORMATION") then "COLUMNS" else if Text.Contains([Column1], "~ASCII DATA AREA") then "DATA" else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"curveFinder"}),
columnNames =
let
#"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([curveFinder] = "COLUMNS")),
#"Removed Top Rows" = Table.Skip(#"Filtered Rows",1),
#"Removed Bottom Rows" = Table.RemoveLastN(#"Removed Top Rows",1),
#"Removed Other Columns" = Table.RemoveColumns(#"Removed Bottom Rows",{"curveFinder"}),
#"Extracted Text After Delimiter" = Table.TransformColumns(#"Removed Other Columns", {{"Column1", each Text.AfterDelimiter(_, " . "), type text}}),
#"Trimmed Text" = Table.TransformColumns(#"Extracted Text After Delimiter",{{"Column1", Text.Trim, type text}}),
#"Cleaned Text" = Table.TransformColumns(#"Trimmed Text",{{"Column1", Text.Clean, type text}}),
#"Replaced Value" = Table.ReplaceValue(#"Cleaned Text"," ","",Replacer.ReplaceText,{"Column1"}),
Custom1 = #"Replaced Value"[Column1]
in
Custom1,
data =
let
#"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([curveFinder] = "DATA")),
#"Removed Top Rows" = Table.Skip(#"Filtered Rows",1),
#"Removed Columns" = Table.RemoveColumns(#"Removed Top Rows",{"curveFinder"}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns", "Column1", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), columnNames)
in
#"Split Column by Delimiter"
in
dataI've tested this on your log file, which contains 22 columns. I also incrementally deleted column names and corresponding data columns as part of my tests. It passed those tests.
While this may work now, it is very brittle and makes a TON of assumptions about the structure of your data in the future. Most important assumptions:
- Column names will always fall under '~CURVE INFORMATION' and the data will always fall under '~ASCII DATA AREA'
- There will always be a space between the last column name and '~ASCII DATA AREA'
- Column names will always be after this delimiter: ' . '
- The data values will always be delimited by a space (' ')
I hope this helps.