2017-02-09 6 views
1

私のデータがページに分割されたレポートから来ており、ページのいくつかがデータを別の列に偏らせているところで、パワークエリに問題があります。私はエラーベースの解決策があるかもしれないと思うが、私はそれがより冗長であり、テキスト対数値エラー訂正に依存しないことを望む。主に、場合によってはアルファベットである可能性のあるデータは、他の場合は数値であることがあるためです。名前とコードの置換えをランダムに生成したデータセットを用意しました。私はまた、異なるシフトの例を示すために、そして異なるページから分割されたレコードを説明するために、データをちょっと調べなければなりませんでした。電力クエリ斜めのデータ

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

は、最終的には、レコードごとに1行が含まれていますデータセット内の12件の記録があります。 第1ページは、ソース文書から切り取った生データです。これらは、レコードごとに1行に移動する必要があるチェック履歴レコード(マスク)です。

[名前、日付、チェック番号など] [収益] [控除] [税金]

名前、日付、レコードID番号、および金額を含むレコード情報は、生データから抽出およびフォーマットされた最初のものです。 NameDataとCheckDataで適用した手順では、これらのレコードをどのように抽出してフォーマットするかを示します。また、このセクションのスキューされたデータの一部は、マージ関数と条件付きのカラムで簡単に調整できます。

それぞれの個別支払項目(収益コード、控除コード、または税コード)は、それ自身の列にピボットされてフォーマットされます。このマヌーバの例をEarnings Queryで見ることができます。 PayItemReferenceクエリは、私のPay Itemsへの出発点として使用するいくつかの基本的なフィルタです。そのクエリでは、コードが列と列にシフトし、テキストと数値が混在していることがわかります。コードとその値の間にスペースがあったりスペースがない場合は、列を完全にシフトすることもできます。

私は、コードとその値を通常の列に統合する作業をしています。その後、マージ、アンピボット、ピボットなどを行い、最終的な書式設定を取得します。私は条件付きの列とエラーを使用しようとしましたが、元のデータセットのいずれかに小さな問題が常にあります。私はちょうど新しい目とデータへの新しいアプローチが必要です。

+0

あなたは、あなたのデータは次のように見て、それがどのように列に分割されなければならないことができる方法の正確な詳細に説明する必要があります。あなたの例では、すべての行に7つの位置があるので、シフトは全く見られません。数字の場合は、通貨記号や通貨記号があり、データの文化も関連する場合があります(例えば、2011年1月2日が英国では2月1日、米国では1月2日です) 。 – MarcelBeug

+0

私の編集によって、データを少しだけ見せてくれることを願っています。文脈によって$ currencyまたはDecimal hoursレコードを表すことができるので、すべての数値は通常10進数です。 – CRSPLK

+0

これでは不十分です。入力のどの部分をどの列に入れるべきかをどのように決定するかについての明確な仕様がなくても、可能なすべての代替シフトで、私たちはあなたを助けることができません。 – MarcelBeug

答えて

1

これは困難な作業でした。

まず、各ページの列構造はおそらく一意であるため、表をページに分割することをお勧めします。したがって、私はテーブルのリストを形成します。各テーブルは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