2017-02-09 32 views
1

我在电源查询中遇到问题,其中数据来自分成多个页面的报表,并且一些页面将数据倾斜到不同的列。我认为可能存在基于错误的解决方案,但我希望它更加多余,不要依赖文本与数字纠错。主要是因为有时在某些情况下可能是字母数据的数据在其他情况下可能是数字。我准备了一个随机生成名称和代码替换的数据集。我也不得不稍微屠宰这些数据,以举例说明不同的转变,并且解释从不同页面分割出来的记录。电源查询歪斜的数据

https://drive.google.com/file/d/0B2qUbAWJXgfyNlByV2RHODJzQjA/view?usp=sharing

有12条记录中的数据集,最终将包含每条记录一行。 第一页是从源文档中剥离的原始数据。这些是检查历史记录(被屏蔽),需要被移动到每个记录的单行,并且具有用于四个特定区域的单独列:

[收入] [扣除] [税收]

记录信息包括名称,日期,记录ID号和金额是从原始数据中提取并格式化的第一手东西。我在NameData和CheckData中应用的步骤将显示如何提取和格式化这些记录,本节中的一些偏斜数据也很容易与合并函数和条件列协调一致。

每个单独的付款项目(收入代码,扣除代码或税代码)被格式化,然后转到它自己的列。您可以在收入查询中看到此操作的示例。 PayItemReference查询是我用作My Pay Items的起点的一些基本过滤器。您可以在该查询中看到代码将从列到列,文本和数字混合。代码和值之间可以有空格,或者没有空格,也可以完全移动列。

我正在合并代码和它们的值到常规列,然后我可以合并,unpivot,主轴等,以达到最终的格式。我尝试过使用条件列和错误,但是在原始数据集上总是存在小问题。我只需要一些新的眼睛和新的数据方法。

+0

你需要精确详细解释你的数据如何能像它应该如何拆分成多列。在你的例子中,我没有看到任何变化,因为所有的行都有7个位置。此外,对于数字来说,如果存在任何。或货币符号并且数据的文化也可能相关(例如,2017年2月1日是英国2月1日和美国1月2日) 。 – MarcelBeug

+0

我希望我的编辑能让这些数据更具代表性。所有数字通常都是十进制数字,因为它们可以根据上下文表示$ currency或Decimal hours记录。 – CRSPLK

+0

这还不够。如果没有明确的规范说明如何确定哪一部分输入应放入哪一列,并且有所有可能的备选班次,我们将无法为您提供帮助。 – MarcelBeug

回答

1

这是一项具有挑战性的任务。

首先,将表格拆分回页面是个好主意,因为每个页面的列结构可能都是唯一的。因此,我形成表格列表,每个表格为一页。然后,我必须处理每个页面:提取列名称,为每行添加摘要信息,过滤不需要的行,并设置列名称。这是通过使用自定义功能ConvertTable为列表中的每个表完成的。之后,您只需组合生成的表格。

这里:

let 
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], 
    AddRowNum = Table.AddColumn(Table.AddIndexColumn(Source, "Index", 1, 1), "RowNum", each Number.Mod([Index]-1, 52)+1, type number), 
    CountTables = {1..(Number.RoundUp(Table.RowCount(AddRowNum)/52, 0))}, 
    ListTables = List.Transform(CountTables, (ListItem)=>Table.SelectRows(AddRowNum, each [Index] > 52 * (ListItem - 1) and [Index] <= 52 * ListItem)), 

    ConvertTable = (tbl as table) as table => 
    let 
     hdr1 = Table.Transpose(Table.FillDown(Table.Transpose(Table.FromRecords({tbl{6}})), {"Column1"})), 
     hdr2 = Table.FromRecords({tbl{7}}), 
     ColNames = Table.Transpose(Table.SelectColumns(Table.FirstN(Table.AddColumn(Table.Transpose(Table.Combine({hdr1, hdr2})), "ColumnName", each [Column1] & ": " & [Column2]), 19), {"ColumnName"})), 
     AddPayDate = Table.AddColumn(tbl, "Pay Date", each if [RowNum] > 8 and Text.Trim(tbl{[RowNum]-2}[Column9]) = "Pay Date" then [Column9] else null, type date), 
     AddPeriodEndDate = Table.AddColumn(AddPayDate, "Period End Date", each if [RowNum] > 8 and Text.Trim(tbl{[RowNum]-2}[Column12]) = "Period End Date" then [Column12] else null, type date), 
     AddJobCode = Table.AddColumn(AddPeriodEndDate, "Job Code", each if [RowNum] > 8 and Text.Trim(tbl{[RowNum]-2}[Column14]) = "Job Code" then [Column14] else null, Int64.Type), 
     AddCheckInfo = Table.AddColumn(AddJobCode, "Check Info", each if [RowNum] > 8 and Text.Trim([Column1]) = "Check Printed:" then Table.Transpose(Table.SelectRows(Table.Transpose(Table.FromRecords({_})), each [Column1] <> null)) else null), 
     ExpandedCheckInfo = Table.ExpandTableColumn(AddCheckInfo, "Check Info", {"Column4", "Column6", "Column8"}, {"Check Amount", "Direct Deposit", "Net"}), 
     FillUp = Table.FillUp(ExpandedCheckInfo, {"Column3", "Check Amount", "Direct Deposit", "Net"})//Table.AddColumn(AddJobCode, "tmp2", each if [RowNum] < 9 then "" else (if Text.Trim([Column1]) = "Check Printed:" then (if [Column3] = null then -1 else [Column3]) else null), type text), {"tmp2"}), 
     FillDown = Table.FillDown(FillUp, {"Column1", "Column5", "Pay Date", "Period End Date", "Job Code"}), 
     AddCheckEEIDfixed = Table.AddColumn(FillDown, "Check:EEID.fixed", each Text.From([Column5]) & ":" & Text.From([Column3]), type text), 
     FilteredExtraRows = Table.SelectRows(AddCheckEEIDfixed, each [RowNum] > 8 and Text.Trim([Column1]) <> "Check Printed:" and Text.Trim([Column7]) <> "PerControl" and Text.Trim(tbl{[RowNum]-2}[Column7]) <> "PerControl" and [#"Check:EEID.fixed"] <> null), 
     DemotedHeaders = Table.DemoteHeaders(FilteredExtraRows), 
     GetColumnNames1 = Table.Combine({Table.FromRecords({DemotedHeaders{0}}), ColNames}), 
     GetColumnNames2 = Table.PromoteHeaders(Table.FillDown(GetColumnNames1, Table.ColumnNames(GetColumnNames1))), 
     SetColumnNames = Table.PromoteHeaders(Table.Combine({GetColumnNames2, FilteredExtraRows})) 
    in 
     SetColumnNames, 

    ConvertedList = List.Transform(ListTables, (t) => ConvertTable(t)), 
    GetWholeTable = Table.Combine(ConvertedList) 
in 
    GetWholeTable