今回は、データの途中に文字を挿入する方法を紹介していこう。といっても、「Power Query エディター」に専用のコマンドが用意されている訳ではない。これまでに紹介してきた「列の分割」や「列のマージ」、「例からの列」、「値の置換」といったコマンドで対処方法を検討していく必要がある。

データの途中に文字を挿入する際に使えるコマンド

前回の連載で紹介したように、“データの先頭”に文字を追加するときは「プレフィックスの追加」、“データの末尾”に文字を追加するときは「サフィックスの追加」といったコマンドが活用できる。では、“データの途中”に文字を追加したい場合はどうすればよいだろうか?

  • データの途中に文字を挿入

今回は、“データの途中”に文字を追加する方法をいくつか紹介していこう。状況によっては、これまでに紹介してきたコマンドだけで対応することが可能だ。

携帯電話番号に「-」(ハイフン)を挿入

まずは、決められた位置(何文字目)に文字を挿入する方法から紹介していこう。以下の図は、あるサービスの会員名簿を「Power Query エディター」に取得した例だ。ただし、「携帯電話番号」が“ハイフンなし”の文字列として入力されているため、少し読み取りづらい。

  • 「ハイフンなし」の携帯電話番号

データが見やすくなるように、適切な位置に「-」(ハイフン)を挿入してみよう。そのためには、ハイフンを挿入する位置で「列の分割」を行っておく必要がある。「携帯電話番号」の列を選択し、「列の分割」→「位置」を選択する。

  • 「列の分割」→「位置」を選択

すると、「何文字目で列を分割するか?」を指定する画面が表示される。この位置指定は、“N文字目の直後”をカンマ区切りの数値で指定する仕組みになっている。「携帯電話番号」を分割する場合を例に具体的な手順を解説していこう。

最初に「0」の数値を入力する。この「0」は“0文字目の直後”、すなわち“データの先頭から”を意味するものとなる。続いて、次の区切り位置を指定する。携帯電話番号は、090や080など、最初の3桁の後がハイフンになる。よって、“3文字目の直後”でデータを分割する。同様に、次の4桁は3+4=7文字目になるので“7文字目の直後”でデータを区切る。以上をまとめると「0,3,7」という指定になる。

  • 分割位置の指定

「OK」ボタンをクリックすると、指定した位置でデータを分割した結果が表示される。ただし、分割後のデータが「整数型」として扱われているため、「090」は「90」、「080」は「80」という具合に最初の「0」が省略されてしまう。

  • 分割された列

これを正しい表記に修正するには、各列のデータ型を「テキスト」に変更しなければならない。

  • データ型を「テキスト」に変更

同様の操作を3つの列で行うと、最初の「0」が省略されなくなり、それぞれの数字を3桁、4桁、4桁で表示できるようになる。あとは、間に「-」(ハイフン)を挿入しながら列を結合するだけ。3つの列を同時に選択し、「変換」タブにある「列のマージ」をクリックする。

  • 分割した列を選択し、「列のマージ」をクリック

区切り記号に「カスタム」を選択し、「-」(ハイフン)の文字を入力する。続いて、結合後の「列名」を入力し、「OK」ボタンをクリックする。

  • 「区切り記号」と「列名」の指定

以上で、「携帯電話番号」を“XXX-XXXX-XXXX”という表記に加工する処理は完了だ。

  • 結合された列

このように「一定の文字数」で区切った場所に「特定の文字」を挿入したい場合は、「列の分割」と「列のマージ」を組み合わせて利用するとよい。「列の分割」→「位置」の使い方をマスターしておけば、“好きな桁数”でデータを自由に分割できるようになる。この機会に覚えておくとよいだろう。

なお、このデータ表には「電話番号」のデータも“ハイフンなし”で入力されている。

  • 「電話番号」の列

こちらもハイフンで区切った表記にするとデータが見やすくなるが、これは相当に難しい作業となる。というのも、固定電話はハイフンの挿入位置が一定ではないからだ。東京(03)や大阪(06)のように2桁で区切るケースもあれば、各務原市(058)や札幌市(011)のように3桁で区切るケースもある。さらには、市外局番が4桁になるケースもある。

これに対処するには、データの“先頭から数文字”の値に応じて処理を分岐させなければならない。ただし、その分岐条件は相当に複雑で、if文などで対応できるレベルではない。正直な話、個人で対処するのは不可能に近い問題といえるだろう。専用のツールを利用するなど、別の対処方法を考える必要がある。このように仕組みが複雑すぎると、「Power Query エディター」で対応するのは不可能に近い……、となってしまうケースもある。

8桁の数字で表現された日付に「/」(スラッシュ)を挿入

続いては、“8桁の数字”で表現された日付を「日付データ」として扱えるように加工する方法を紹介していこう。

以下の図は、「生年月日」のデータが“8桁の数字”で入力されている例だ。2003年10月30日は「20031030」、1951年3月28日は「19510328」という具合に、年月日が4桁、2桁、2桁の数字で連続して記述されている。このままの状態では、データを「日付データ」として扱うことができない。

  • 8桁の数字で表現された「生年月日」

このような場合は、適切な位置に「/」(スラッシュ)を挿入してあげると、データを「日付データ」と扱えるようになる。手順は先ほど示した例と同じ。データが4桁、2桁、2桁なるように「列の分割」を行い、その後、区切り記号に「/」(スラッシュ)を指定して「列のマージ」を行えばよい。

同じ手順を何度も紹介しても意味がないので、今度は別の方法を試してみよう。それは「例からの列」を利用する方法だ。「生年月日」の列を選択し、「列の追加」タブにある「例からの列」→「選択範囲から」を選択する。

  • 「例からの列」を開始

このような画面が表示されるので、“加工後のデータ”の例を自分で入力していく。今回の場合、最初のデータは「20031030」なので「2003/10/30」と入力して「Enter」キーを押す。

  • 例の入力

他のデータについても“加工後のデータ”が自動推測される。今回は、例を1件入力しただけで、すべてのデータを正しく加工できているようだ。そのまま「OK」ボタンをクリックする。

  • 変換されたデータの確認

データ表の右端に“新しい列”が追加され、そこに“加工後のデータ”が表示される。以降は、この列を「生年月日」のデータとして利用していけばよい。すでに「日付」のデータ型が指定されているので、このまま「日付データ」として扱うことが可能だ。

  • 追加された列

もとの「生年月日」の列を削除し、新しく追加された列の列名を「生年月日」に変更する。その後、適当な位置へ列を移動すると、以下の図のようなデータ表に加工できる。

  • 日付データに変換された「生年月日」

このように「例からの列」を使って、データの途中に文字を挿入できるケースもある。上手くいくかは「実際に試してみないと分からない……」という側面もあるが、一つの手法として覚えておくと役に立つだろう。

スペースを挿入して区切り位置を明確にする

次は、データの区切りとなる位置に「半角スペース」を挿入する例を紹介していこう。以下の図に示した「所属」のデータは、「▲▲支社」(または東京本社)と「△△部」の文字が隙間なく入力されている。

  • スペースなしで入力されている「所属」

ここに「半角スペース」を挿入する方法を考えてみよう。この場合、「社」の文字が注目ポイントになる。具体的には、「社」の文字の後に「半角スペース」を挿入してあげればよい訳だ。

よって、「社」の文字で列を分割して……、と考えるかもしれないが、そのような手間は必要ない。もっと単純に、「社」→「社(半角スペース)」の置換を行うだけで、「▲▲支社」と「△△部」の間に間隔を設けることができる。

  • 「値の置換」を使ったスペースの挿入

  • スペースを挿入した「所属」

このように「値の置換」を使って、データの途中に文字を挿入する方法もある。使える場面は限定的になるが、手軽に処理できる方法として頭に入れておくとよいだろう。

最後に、「氏名」の“姓”と“名”が隙間なく入力されている場合を考えてみよう。こちらも“姓”と“名”の間に「半角スペース」があった方が便利かもしれない。

  • スペースなしで入力されている「氏名」

しかし、残念ながら、この問題に対処する方法はない。氏名の“姓”は1~3文字の場合が多く、中には4文字、5文字になる“姓”もある。よって、文字数で区切ることは不可能だ。データの内容(氏名)を人の目で確認して、ひとつずつ対処するしか、これといった対処法は見当たらない。

AIを使うことができれば、ある程度は“姓”と“名”を自動判別できるかもしれないが、それでも絶対に正しい結果を得るのは難しいだろう。というのも、人間でも判別不能なケースがあるからだ。

たとえば、「森元輝」という氏名データがあったとしよう。このデータは、「森 元輝」(もり もとてる)が正しいのか、それとも「森元 輝」(もりもと あきら)が正しいのか? データ表だけをもとに、この問題を解読するのは不可能だ。本人(森元輝さん)に正解を尋ねるしか解決法がないかもしれない。

このように「データの途中に文字を挿入できるかどうか?」は、状況に応じて対処方法や可否が大きく異なる。言い換えると、「データを適切に分割できるか?」と捉えることもできるだろう。こういった問題は、対応できる場合もあれば、対応不可の場合もあるのが実情だ。

データ処理の観点から見れば、なるべく細かく分割されているデータの方が「対処方法は簡単」といえる。“姓”と“名”を結合して「氏名」にするのは簡単だが、「氏名」を“姓”と“名”に分割するのは難しい。データベースを設計する際は、このような観点も考慮してながら入力項目を決定していくと、余計なトラブルを回避できるだろう。