PowerQueryが不規則なTXTテキストを処理する2つの考え方の概要

4739 ワード

『M Is for Data Monkey』第7章では、著者らは、PowerQueryを使用して不規則なTXTテキストを処理する方法を実例で示した(青い部分をクリックしてサンプルファイルをダウンロードできる).私自身は以下の方法で処理して初歩的な結果を得ました.
let
  = Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\wangh\Documents\power pivot  \M is for Data monkey Examples\Ch07 Examples\GL Jan-Mar.TXT"), null, null, 936)}),
       = Table.Skip( ,10),
      = Table.TransformColumns(      ,{},Text.Trim),
      = Table.SplitColumn(     ,"Column1",Splitter.SplitTextByRepeatedLengths(15),{"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7", "Column1.8", "Column1.9"}),
      = Table.TransformColumnTypes(     ,{{"Column1.1", type text}, {"Column1.2", type text}, {"Column1.3", type text}, {"Column1.4", type text}, {"Column1.5", type text}, {"Column1.6", type text}, {"Column1.7", type text}, {"Column1.8", type text}, {"Column1.9", type text}}),
     = Table.CombineColumns(     ,{"Column1.5", "Column1.6"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"   "),
    1 = Table.CombineColumns(    ,{"Column1.7", "Column1.8"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"   .1"),
     = Table.RemoveColumns(    1,{"Column1.3", "Column1.9"}),
      = Table.PromoteHeaders(    ),
     = Table.SelectRows(     , each ([#"Tran Date      "] <> null and [#"Tran Date      "] <> "123-03         " and [#"Tran Date      "] <> "===== End of Re" and [#"Tran Date      "] <> "===============" and [#"Tran Date      "] <> "Account        " and [#"Tran Date      "] <> "Balance        " and [#"Tran Date      "] <> "Dept xxx - Rest" and [#"Tran Date      "] <> "Detailed Genera" and [#"Tran Date      "] <> "Feb 2006" and [#"Tran Date      "] <> "Mar 2006" and [#"Tran Date      "] <> "March 20,2009  " and [#"Tran Date      "] <> "No.            " and [#"Tran Date      "] <> "Tran Date      " and [#"Tran Date      "] <> "XYZ Company Ltd"))
in
    

本の中の処理方法は違います.
let
  = Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\wangh\Documents\power pivot  \M is for Data monkey Examples\Ch07 Examples\GL Jan-Mar.TXT"), null, null, 936)}),
       = Table.Skip( ,10),
      = Table.TransformColumns(      ,{},Text.Trim),
      = Table.SplitColumn(     ,"Column1",Splitter.SplitTextByRepeatedLengths(15),{"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7", "Column1.8", "Column1.9"}),
      = Table.TransformColumnTypes(     ,{{"Column1.1", type text}, {"Column1.2", type text}, {"Column1.3", type text}, {"Column1.4", type text}, {"Column1.5", type text}, {"Column1.6", type text}, {"Column1.7", type text}, {"Column1.8", type text}, {"Column1.9", type text}}),
     = Table.CombineColumns(     ,{"Column1.5", "Column1.6"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"   "),
    1 = Table.CombineColumns(    ,{"Column1.7", "Column1.8"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"   .1"),
     = Table.RemoveColumns(    1,{"Column1.3", "Column1.9"}),
      = Table.PromoteHeaders(    ),
     1 = Table.TransformColumnTypes(     ,{{"Tran Date      ", type date}}),
      = Table.RemoveRowsWithErrors(     1, {"Tran Date      "}),
     2 = Table.TransformColumnTypes(     ,{{"Tran Amount    ", type number}}),
     1 = Table.RemoveRowsWithErrors(     2, {"Tran Amount    "}),
     = Table.SelectRows(     1, each ([#"Tran Amount    "] <> null))
in
    

違いは、11行目からフィルタリングを使用したのに対し、著者らは「TransDate」と「TransAmount」の2列のフォーマットを変更し、エラーと空の行を削除することで、不要な行を取り除く目的を達成したことです.
どう見ても私の操作はもっと簡単なようです.私はこのステップをスクリーニングすることで、著者が4つのステップで実現できる騒音行を取り除く目的を実現しました.
しかし、実際には、私のフィルタリングはハードコーディングに相当し、この特定の例にのみ適用されますが、著者のこの方法は、類似したフォーマットのすべてのTXTドキュメント処理に適用されるよりスマートです.本の中で、著者はすぐに2番目のファイル「GL Apr-Jun.TXT」を導入し、著者の処理方式で、PowerQueryをリフレッシュするだけでokになり、私のフィルタ方式では、フィルタステップにフィルタ条件を追加する必要があります.
【反省】PowerQueryはデータをプログラム的に処理する方法であるため、特定のファイルのみを処理するのではなく、操作手順を抽象化するために、ハードコーディングをできるだけ避ける必要があります.