0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

こんな人におすすめ

  • Power BIやExcelのPower QueryでCSVや複数の同じフォーマットのExcelテーブルを結合させている
  • データを結合して使うと重すぎて更新が終わらない
  • 日別のデータはいらない。月末と今月の直近日データだけ使いたい

日付を含んだファイル名のCSVファイルなどをファイルサーバやSharePointのドキュメントライブラリに保存しているということはよくあるでしょう。
でも、実際に必要なのは月末日のデータだけで、月ごとのサマリを知りたいようなケースというのは多いです。

今回は、Power Queryで結合前に必要なデータだけに絞る方法を紹介します。

更新が重いからちょっとでも先にデータを減らしたい

Power BIやExcelで利用できるPower Queryは同じフォーマットで作成されたこれらのファイルを結合して分析することができますが、ファイル数が大量になってくると処理が重くなります。

必要なのは月末日付の値だけという場合に、各月の最大日付だけを処理できるようにフィルタリングできないか試してみました。

image.png

まずは上記のような日付つきのファイルを用意しました。
今回のばあいは例として用意したファイルのなかから、5/31,6/15,7/1 のファイルだけを残せるようにクエリを作っていきます。

今回はファイル名から日付列を作成していますが、SharePointに保存された日付を使っても同じことができます。

日付列をつくる

ファイル名から日付列を作ります。SharePointフォルダで取り込みを行い、Folder Pathを指定して読み込みました。
image.png

今回の場合はファイル名の先頭に日付が入っていてアンダーバーで区切られているので、先頭8文字を切り取って、20260601のような値を取り出した後、4文字あとと7文字あとに「-」を突っ込んで「2026-06-01」のような文字列を作り、それを「date」型に変換するようなクエリを詳細エディタで加えます。

image.png

let
    ソース = SharePoint.Files("https://<あなたのサイト>.sharepoint.com/sites/testSite/", [ApiVersion = 15]),
    フィルターされた行 = Table.SelectRows(ソース, each [Folder Path] = "https://<あなたのサイト>.sharepoint.com/sites/testSite/Shared Documents/test/"),
    
    FileDate列を追加 = Table.AddColumn(
        フィルターされた行,
        "FileDate",
        each Date.FromText(
            Text.Insert(
                Text.Insert(Text.Start([Name], 8), 4, "-"),
                7,
                "-"
            )
        ),
        type date
    )

in
    FileDate列を追加

これで一発でFileDate列が追加されました。アンダーバーの区切り文字よりも前の値をとってから型変換をしてもよいですし、そのほうが簡単ですが、1ステップでも減らすことで更新の負荷を下げることを心がけます。
image.png

年月列を作る

こんどは、先ほど追加したFileDate列を参照して2026-06 のような月だけを表すテキスト型の列を作ります。
image.png

    // 年月列
    年月列を追加 = Table.AddColumn(
        FileDate列を追加,
        "YearMonth",
        each Date.ToText([FileDate], "yyyy-MM"),
        type text
    )

月ごとにグループ化する

次に下記のクエリを加えます。

       月末のみ抽出 =
        Table.Group(
            年月列を追加,
            {"YearMonth"},
            {
                {"データ", (t) =>
                    Table.SelectRows(
                        t,
                        each [FileDate] = List.Max(t[FileDate])
                    )
                }
            }
        )

image.png

何をやってるの?

簡略化するとこんな感じ

Table.Group(
    年月列を追加,
    {"YearMonth"},
    {{"データ", (t) => ...}}
)

データ列の中にサブテーブルが入ったような形になります。

YearMonth | データ
----------|------------------------
2026-06   | (6月のテーブル)
2026-07   | (7月のテーブル)

この時に、テーブル1つずつには、FileDate(日付型)が最大のものと一致する行だけが投げ込まれます。小さなループが回るイメージです。

(t) =>
    Table.SelectRows(
        t,
        each [FileDate] = List.Max(t[FileDate])
    )

この状態で「データ」列を開いてみるとわかりやすいです。
image.png

今回の目的である各月の最終日だけが残りました。でも、これだとファイルを取り出せないので、ちょっとクエリを修正します。
image.png

ExpandTableColumnを使って、先ほどGUI画面で開いた操作を追加の列として広げてやります。

月末のみ抽出 =
        Table.ExpandTableColumn(
            Table.Group(
                年月列を追加,
                {"YearMonth"},
                {
                    {"データ", (t) =>
                        Table.SelectRows(
                            t,
                            each [FileDate] = List.Max(t[FileDate])
                        )
                    }
                }
            ),
            "データ",
            {"Name", "FileDate","Content"}
        )

これで使いたいファイルだけを残す音ができました。肝心のContent列も忘れずに!
あとはContent右側にある結合ボタンを押して一つにするだけです。
image.png

クエリ全体はこちら

今回のMクエリ全体を載せておきます。

let
    ソース = SharePoint.Files("https://<あなたのサイト>.sharepoint.com/sites/testSite/", [ApiVersion = 15]),

    フィルターされた行 = Table.SelectRows(
        ソース,
        each [Folder Path] = "https://<あなたのサイト>.sharepoint.com/sites/testSite/Shared Documents/test/"
    ),
    
    FileDate列を追加 = Table.AddColumn(
        フィルターされた行,
        "FileDate",
        each Date.FromText(
            Text.Insert(
                Text.Insert(Text.Start([Name], 8), 4, "-"),
                7,
                "-"
            )
        ),
        type date
    ),
    
    年月列を追加 = Table.AddColumn(
        FileDate列を追加,
        "YearMonth",
        each Date.ToText([FileDate], "yyyy-MM"),
        type text
    ),
    


    月末のみ抽出 =
            Table.ExpandTableColumn(
                Table.Group(
                    年月列を追加,
                    {"YearMonth"},
                    {
                        {"データ", (t) =>
                            Table.SelectRows(
                                t,
                                each [FileDate] = List.Max(t[FileDate])
                            )
                        }
                    }
                ),
                "データ",
                {"Name", "FileDate","Content"}
            )
in
    月末のみ抽出

ラムダ式

今回使った => 演算子はラムダ式という書き方で、関数を使うケースで利用されている音が多いようです。
こちらの記事を参考にさせていただきました。奥が深すぎて使いこなせないですが、グループとの組み合わせに相性が良いように思います。

こちらの記事もどうぞ

今回のような処理を使う方には、こちらのような月末系の処理もうれしいんじゃないかな?と思うので、過去に書いた記事を紹介します。

こんな人が書いてます

こちらの記事はランゲルハンス島のDDさんが紹介しました。ブログでクラウドフローのTIPSのようなものを書いたり、Qiita記事を書いたりしていますのでご贔屓に。

フォローやいいねいただけると嬉しいです。
関西のPowerPlatform系の勉強会にときどき出没しますので、「あのアイコンの顔の人だ!」と、気軽に声をかけていただけると喜びます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?