Power Query 実務テンプレ | クレンジング(前処理)系:改行コード削除

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

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

今回のテーマは「Power Query で セル内に紛れ込んだ改行コード(折り返し)をきれいに削除する実務テンプレ」です。

Excel で「セル内改行(Alt+Enter)」が入っているデータや、
外部システムからの出力で \r\n(CRLF)などが混ざっているデータを想定します。

やりたいことはシンプルです。
見た目は同じなのに、改行が混ざっていて JOIN・集計・検索がズレる問題を防ぐ。
「改行は全部消す」か「改行をスペースに置き換える」かをルール化して、一括で処理できるようにする。


まず「改行コード」の正体をおさえる

Excel のセル内改行と Power Query の改行

Excel で Alt+Enter で入る「セル内改行」は、
Power Query では 改行文字(LF = #(lf))や CRLF(#(cr)#(lf) として扱われます。

代表的な改行コードは次の3つです。

  • #(lf) … Line Feed(LF, コード 10)
  • #(cr) … Carriage Return(CR, コード 13)
  • #(cr)#(lf) … Windows でよくある CRLF の組み合わせ

実務的には「とにかく改行っぽいものは全部消す or スペースにする」という方針で十分です。


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

例えば、こんなテーブルを想像してください。

顧客コード顧客名備考
A001田中太郎“東京本社\r\n1階受付”
A002“山田\r\n花子”“”
A003佐藤次郎“VIP\r\n要事前連絡”

見た目では「セル内改行されているだけ」に見えますが、
Power Query 的には「文字列の途中に改行コードが入っている」状態です。

これを、例えば次のようにしたいとします。

  • 改行を削除して、単純にくっつける
    • "東京本社1階受付", "山田花子", "VIP要事前連絡"
  • もしくは、改行をスペースに置き換える
    • "東京本社 1階受付", "山田 花子", "VIP 要事前連絡"

どちらを採用するかは業務次第ですが、やり方はほぼ同じです。


基本テンプレ:1列の改行コードを削除する

顧客名列から改行を削除するシンプル版

まずは「顧客名」列だけを対象に、
改行コード(CR, LF, CRLF)を削除するテンプレです。

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

    Cleaned =
        Table.TransformColumns(
            Source,
            {
                {
                    "顧客名",
                    each
                        let
                            t = Text.From(_),
                            noCR = Text.Replace(t, "#(cr)", ""),
                            noLF = Text.Replace(noCR, "#(lf)", "")
                        in
                            noLF,
                    type text
                }
            }
        )
in
    Cleaned
Power Query

やっていることを言葉で整理するとこうです。

  • Text.From(_) で値を文字列として扱う
  • Text.Replace(t, "#(cr)", "") で CR を削除
  • さらに Text.Replace(..., "#(lf)", "") で LF も削除
  • 結果として、改行コードがすべて消えた文字列になる

これで "山田\r\n花子""山田花子" になります。


応用:改行を「削除」ではなく「スペースに置き換える」

見た目の区切りを残したい場合

「山田花子」をくっつけるのではなく、「山田 花子」のようにスペースで区切りたい場合は、
削除ではなく置き換えにします。

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

    Cleaned =
        Table.TransformColumns(
            Source,
            {
                {
                    "顧客名",
                    each
                        let
                            t = Text.From(_),
                            replCR = Text.Replace(t, "#(cr)", " "),
                            replLF = Text.Replace(replCR, "#(lf)", " "),
                            trimmed = Text.Trim(replLF)
                        in
                            trimmed,
                    type text
                }
            }
        )
in
    Cleaned
Power Query

ポイントは次の通りです。

  • CR と LF をスペース " " に置き換える
  • 最後に Text.Trim で前後の余計なスペースを削る

これで "山田\r\n花子""山田 花子" のように、
「改行の位置にスペースを残したままフラットな文字列」にできます。


実務向け:全ての文字列列から改行コードを削除する

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

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

まずは「改行削除専用の関数」を一つ作っておくと、再利用しやすくなります。

改行削除関数を作る

// クエリ名:fn_RemoveNewLine
let
    RemoveNewLine = (text as nullable text) as nullable text =>
        let
            t =
                if text = null then
                    null
                else
                    Text.From(text),

            noCR =
                if t = null then
                    null
                else
                    Text.Replace(t, "#(cr)", ""),

            noLF =
                if noCR = null then
                    null
                else
                    Text.Replace(noCR, "#(lf)", "")
        in
            noLF
in
    RemoveNewLine
Power Query

これで、fn_RemoveNewLine("山田#(cr)#(lf)花子")"山田花子" を返します。

全テキスト列に一括適用するクエリ

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

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

    // 2) 各文字列列に fn_RemoveNewLine を適用する変換リストを作成
    TransformList =
        List.Transform(
            TextColumns,
            (colName) =>
                {colName, fn_RemoveNewLine, type nullable text}
        ),

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

これで、「文字列型の列に紛れ込んだ改行コード」は、
どの列にあっても一括で削除されます。


重要ポイントの深掘り

改行削除は「前処理のかなり早い段階」でやる

改行が残ったままだと、次のような問題が起きます。

  • JOIN キーとして使うと、一部だけ結合されない
  • GROUP BY や DISTINCT で、見た目同じなのに別グループ扱いになる
  • エクスポートした CSV を他システムに渡したとき、行がズレる・壊れる

なので、「トリム(前後空白除去)」「全角→半角」「不正文字除去」と同じく、
クレンジングのかなり早い段階で“改行削除”を入れておくのが鉄則です。

「削除」か「スペース置換」かは列ごとに決める

改行をどう扱うかは、列の意味によって変えるのが実務的です。

  • 氏名・コード系:改行は完全に不要 → 削除で OK
  • 備考・コメント系:改行位置の区切りは残したい → スペースに置換が無難

なので、
「氏名・コード列には fn_RemoveNewLine(削除)」
「備考列には“改行→スペース+Trim”版の関数」
というように、列ごとにルールを分けるのがきれいです。


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

「改行コード削除」の本質は、たった一言です。

“セル内改行は、JOIN・集計・エクスポートで確実に悪さをするので、前処理で必ずフラットな文字列にしておく”

そのための型はこうでした。

  • Text.Replace(..., "#(cr)", ...)Text.Replace(..., "#(lf)", ...) で CR / LF を処理する
  • 削除するか、スペースに置き換えるかを列ごとに決める
  • 関数化しておき、対象列または全テキスト列に Table.TransformColumns で一括適用する

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