Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
7 years ago
Solved

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...
  • tonmcg's avatar
    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
        data

    I'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:

     

    1. Column names will always fall under '~CURVE INFORMATION' and the data will always fall under '~ASCII DATA AREA'
    2. There will always be a space between the last column name and '~ASCII DATA AREA'
    3. Column names will always be after this delimiter: ' . '
    4. The data values will always be delimited by a space (' ')

    I hope this helps.