Power Query 実務テンプレ | クレンジング(前処理)系:空白を NULL に統一

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「Power Query で“空白(”” や スペースだけの文字列)を NULL に統一する”実務テンプレ」を身につけることです。
さっきの「NULL を空白に統一」とは逆方向のパターンですね。

どちらを採用するかは“後工程でどう扱いたいか”次第ですが、
集計や「欠損値として扱いたい分析寄りの処理」では、空白より NULL に統一した方が都合がいいことが多いです。

ここでは、次の2つをしっかり押さえます。
「空白」と「NULL」の違いを感覚ではなく言葉で理解する。
文字列列の「空白っぽい値」をきれいに NULL にそろえるテンプレを持つ。


空白と NULL の違いをちゃんと整理する

空白は「中身が空の文字列」、NULL は「値そのものが存在しない」

Power Query における空白("")は、「文字列としての値はあるが、中身が空」という状態です。
一方、NULL は「そのセルに値が存在しない」という“欠損値”です。

例えば、次の比較はすべて false になります。

"" = null
" " = null
null = null

つまり、NULL は「何とも一致しない特別な存在」です。
だからこそ、「欠損値としてちゃんと扱いたい」「空欄を“無いもの”として集計したい」場合は、
空白を NULL に統一しておくと、後のロジックがシンプルになります。


例題の前提データをイメージする

次のようなテーブルを想像してください。

顧客コード顧客名電話番号
A001田中太郎“”
A002“”“03-1234”
“”山田花子” “

ここには、いろいろな「空白っぽい値」が混ざっています。

顧客名が ""(完全な空文字)
顧客コードが ""(空文字)
電話番号が " "(スペースだけ)

見た目は「空欄」に見えますが、Power Query 的には全部「値あり」です。
これを「欠損値として扱いたい」なら、全部 NULL にそろしてしまった方が扱いやすくなります。


基本テンプレ:文字列列の「空白」を NULL に統一する

まずは「空文字だけ」を NULL にするシンプル版

一番シンプルなパターンは、「"" を NULL に変える」テンプレです。

let
    Source = ・・・前のステップ・・・,

    Replaced =
        Table.ReplaceValue(
            Source,
            "",
            null,
            Replacer.ReplaceValue,
            {"顧客コード", "顧客名", "電話番号"}
        )
in
    Replaced
Power Query

これは、「指定した列の中の "" をすべて null に置き換える」という処理です。
列が少ない、固定されている、という場合はこれで十分です。

ただし、ここで置き換えられるのは「完全な空文字」だけです。
" "(スペースだけ)や " "(全角スペースだけ)は対象外です。


実務向け:空文字+スペースだけの文字列も NULL にする

「見た目が空欄なら全部 NULL にしたい」という現場仕様

実務では、「スペースだけ入っているセル」も“空欄扱い”にしたいことが多いです。
その場合は、単純な ReplaceValue では足りないので、「Text.Trim で前後の空白を削ってから判定する」関数を使います。

1列に対して「空白っぽい値 → NULL」をかけるテンプレ

まずは、顧客名列だけに適用するイメージで書いてみます。

let
    Source = ・・・前のステップ・・・,

    Replaced =
        Table.TransformColumns(
            Source,
            {
                {
                    "顧客名",
                    each
                        let
                            t = Text.Trim(Text.From(_))
                        in
                            if t = "" then null else _,
                    type nullable text
                }
            }
        )
in
    Replaced
Power Query

ここでやっていることを分解します。

Text.From(_) で、値をいったん文字列として扱う(NULL の場合はエラーになるので、本当はもう少し丁寧に書くのが安全ですが、まずはイメージ優先)。
Text.Trim(...) で、前後の空白(半角・全角)を削る。
トリム後の文字列が "" なら null に、それ以外なら元の値をそのまま返す。

これで、""" "" " も、全部 NULL に統一できます。


全ての文字列列に一括で「空白 → NULL」をかけるテンプレ

「どの列に空白が紛れているか分からない」ケース

列が多い、どこに空白が入っているか分からない、という場合は、
「文字列型の列を自動で拾って、全部に“空白 → NULL”をかける」テンプレが便利です。

let
    Source = ・・・前のステップ・・・,

    // 1) 文字列型の列名だけを取得
    TextColumns =
        List.Select(
            Table.ColumnNames(Source),
            (colName) =>
                Value.Type(Source[colName]) = type text
        ),

    // 2) 各文字列列に「空白 → NULL」を適用する変換リストを作成
    TransformList =
        List.Transform(
            TextColumns,
            (colName) =>
                {
                    colName,
                    each
                        let
                            v = _
                        in
                            if v = null then
                                null
                            else
                                let
                                    t = Text.Trim(Text.From(v))
                                in
                                    if t = "" then null else v,
                    type nullable text
                }
        ),

    // 3) 一括変換
    Cleaned =
        Table.TransformColumns(
            Source,
            TransformList
        )
in
    Cleaned
Power Query

ここでの重要ポイントは二つです。

最初に v = null をチェックして、もともと NULL のものはそのまま残していること。
Text.Trim で「空白だけの文字列」を空文字にしてから、"" なら NULL にしていること。

これをクレンジングの早い段階に一発入れておけば、
「見た目が空欄のものは全部 NULL」という、分析寄りのきれいな状態を作れます。


どのタイミングで「空白 → NULL」をやるべきか

型変換とセットで考えるのがコツ

空白 → NULL は、次のタイミングで行うのが一番扱いやすいです。

テキストとして扱いたい列を text 型にそろえた直後。
そのあとで、必要な列を number や date に変換する前。

理由はこうです。

数値列にしたい列に " """ が入っていると、そのまま number 型に変換するとエラーになる。
先に「空白 → NULL」にしておけば、number 型への変換時に「NULL は欠損値としてスルー」される。

つまり、「空白を NULL にしてから型変換」の順番にしておくと、
変換エラーをかなり減らせます。


「NULL に統一」と「空白に統一」をどう使い分けるか

どっちが正解、ではなく「目的に応じて使い分け」

前の回では「NULL を空白に統一」、今回は「空白を NULL に統一」と、真逆のことをやっています。
どちらが正しい、ではなく「何をしたいか」で使い分けます。

NULL → 空白に統一した方が楽な場面は、
「文字列として扱い続けたい」「見た目も空欄にしたい」「JOIN キーとして空欄も含めて扱いたい」とき。

空白 → NULL に統一した方が楽な場面は、
「欠損値として扱いたい」「集計で“未入力”をちゃんとカウントしたい」「数値・日付への変換エラーを減らしたい」とき。

あなたのクエリの“ゴール”がどちら寄りかで、
どちらのテンプレを採用するか決めるといいです。


実務テンプレとしてのまとめ

「空白を NULL に統一」の本質は、たった一言です。

見た目が空欄のもの("" やスペースだけ)を、全部「値が存在しない(NULL)」として扱えるようにそろえる。

これをクレンジングのテンプレとして持っておくと、
欠損値の扱い、型変換、集計、分析が一気に安定します。

タイトルとURLをコピーしました