PowerQuery處理不規則TXT文本的兩種思路簡評

在《M Is for Data Monkey》第七章,作者通過實例演示了如何用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行開始,我用了篩選,而作者卻通過更改“Tran Date”和“Tran Amount”兩列的格式,再刪除其中的錯誤和空行來實現剔除不需要的行的目的。

咋一看似乎我的操作更簡單——我通過篩選這一個步驟就實現了作者要四個步驟才能實現的剔除噪音行的目的。

但實際上,我的篩選相當于硬編碼,只適用于這一個特定的例子,而作者的這種方式則更聰明,適用于所有類似格式的TXT文檔處理。在書中,作者很快引入了第二個文件《GL Apr-Jun.TXT》,用作者的處理方式,只需要刷新PowerQuery就ok了,用我的篩選方式,則需要在篩選步驟里新增篩選條件。

【反思】PowerQuery是一種程序化處理數據的方式,因此要盡可能避免硬編碼,這樣才能對操作步驟進行抽象,使其適應于某一類應用場景,而不是只能處理某一個特定的文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,839評論 0 11
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,593評論 9 467
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,239評論 2 33
  • 從喜馬拉雅一直追隨到簡書,今天有幸參加了第一期深度思考訓練營直播。現在已是凌晨,收拾完家務,安排好家人,終于可以躺...
    那里面閱讀 526評論 4 8