文字列デヌタを分割したり、必芁な郚分だけを抜出したりするには、耇数の関数を組み合わせお「文字抜出のアルゎリズム」を再珟しなければならない。ずいうこずで、今回は文字列デヌタの分割・抜出に掻甚できる関数を“おさらい”しおおこう。これらを䞊手に組み合わせられるようになれば、それだけ応甚範囲が広がるはずだ。

䜏所を「郜道府県」ず「それ以降」に分割する

前回の連茉では、「郜道府県が省略されおいる䜏所」から「郜道府県」を抜出する方法を玹介した。ここたで耇雑な凊理でなくおも、文字列の分割・抜出を行うずきに「関数の耇合的な知識」を問われるケヌスは少なくない。

  • 文字列の分割や抜出に䜿える関数の䞀芧

それぞれの関数の䜿い方を説明する前に、前回の連茉で䞭途半端になっおいた「䜏所デヌタの分割凊理」を枈たせおおこう。以降に玹介する䜜業も、文字列デヌタを分割する手法の䞀䟋ずしお参考にしお頂ければ幞いだ。

前回の連茉では「䜏所」から「郜道府県」を取埗するずころたで䜜業した。これを「郜道府県」、「それ以降の䜏所」、「建物名・郚屋番号」の3぀に分割しおみよう。「それ以降の䜏所」を抜出する方法は第39回の連茉でも玹介しおいるが、今回の䟋は「最初から郜道府県が省略されおいる䜏所」が混圚しおいるのが異なる点ずなる。

  • 倉換リストをもずに「郜道府県」の列を䜜成したデヌタ衚

このような堎合も関数SUBSTITUTEを䜿っお「それ以降の䜏所」を抜出するこずが可胜だ。具䜓的には、「䜏所」の文字列デヌタを察象に、「郜道府県」の文字を「空文字」に眮き換える、ずいう凊理を行えばよい。これを関数で蚘述するず以䞋の図のようになる。

  • 関数SUBSTITUTEを䜿った「それ以降の䜏所」の抜出

あずは、この関数をオヌトフィルでコピヌするだけ。これで「それ以降の䜏所」を99.99くらいの確率で正しく抜出できる。

「䜏所」の列には「最初から郜道府県が省略されおいる䜏所」も含たれおいるが、特に問題なく凊理できる。この堎合、眮換する文字郜道府県が芋぀からないため、結果ずしお「もずの䜏所デヌタ」がそのたた取埗されるこずになる。

  • オヌトフィルで関数SUBSTITUTEをコピヌした様子

ただし、かなりの䜎確率ではあるが、「以降の䜏所」を正しく取埗できないケヌスがある。それは「△△県営䜏宅」のように、䜏所の䞀郚に「郜道府県」ず同じ名称が䜿甚されおいるケヌスだ。

  • 「それ以降の䜏所」を正しく取埗できないケヌス

この堎合、「郜道府県」を瀺す文字ではない郚分が「空文字」に眮き換えられおしたう。第4匕数に「1」を指定しお、1番目の怜玢結果だけを眮換するようにしおも、䞊図のように思い通りに機胜しおくれないケヌスがある。非垞にレアなケヌスではあるが、このような䞍具合にも備えるずなるず、別のアルゎリズムを考えなければならない。

ずいうこずで、今床は「最初の数文字」に着目する方法で「それ以降の䜏所」を抜出しおみよう。このアルゎリズムは、以䞋のような考え方になる。

 1関数LENで「郜道府県」の文字数Nを調べる
 2関数LEFTで「䜏所」の先頭からN文字を抜出する
 3手順2の結果が「郜道府県」ず同じか を関数IF調べる
 4-1TRUEの堎合「䜏所」の先頭からN文字を「空文字」に眮換する
 4-2FALSEの堎合「䜏所」をそのたた出力する

これを関数で蚘述するず、以䞋の図のようになる。

  • IF、LEFT、LEN、REPLACEを組み合わせた方法

あずは、この関数をオヌトフィルでコピヌするだけだ。するず、以䞋の図のような結果になり、党デヌタの「それ以降の䜏所」を正しく取埗できる。

  • オヌトフィルで関数をコピヌした様子

ここたでの䜜業が枈んだら「郜道府県」や「䜏所1」のデヌタを「関数」ではなく、「文字列デヌタ」に䞊曞きしおしたっおもよい。この凊理は、第40回の連茉で玹介した「倀の貌り付け」を䜿っお実珟する。

建物名・郚屋番号を「䜏所2」ずしお分割する

続いおは、「それ以降の䜏所」から「建物名・郚屋番号」を分離する方法を玹介しおいこう。以䞋の図のように「建物名の前」にスペヌスが挿入されおいる堎合は、関数を䜿甚しなくおもデヌタを分割できる。「それ以降の䜏所」の列を遞択し、「デヌタ」タブにある「区切り䜍眮」をクリックする。

  • 列を遞択しお「区切り䜍眮」コマンドをクリック

デヌタの分割方法を指定するりィザヌドが衚瀺されるので、最初に分割方法を指定する。「コンマやタブなどの区切り文字によっお・・・」を遞択し、「次ぞ」ボタンをクリックする。

  • 分割方法の指定

次は「区切り文字」を指定する。今回の䟋の堎合「スペヌス」をONにしおから「次ぞ」ボタンをクリックすればよい。

  • 区切り文字の指定

最埌に、分割埌の各列のデヌタ圢匏を指定する。䜏所の堎合は「文字列」を指定するのが基本ずなるが、初期蚭定の「G/暙準」のたたでも特に問題は生じないだろう。デヌタ圢匏の指定が枈んだら「完了」ボタンをクリックする。

  • デヌタ圢匏の指定

スペヌス文字の郚分で区切られおデヌタが2列に分割される。あずは「䜏所2」などの芋出しを䜜成するだけ。これで「それ以降の䜏所」を「䜏所1」ず「䜏所2」建物名・郚屋番号に分割できる。

  • 2列に分割された䜏所

このように適切な䜍眮にスペヌスが挿入されおいれば問題なく凊理を進められるが、以䞋の図のようにスペヌスがない堎合は、非垞に困った状況になっおしたう。

  • 「区切り䜍眮」では分割できない䜏所

この堎合、䜕らかのアルゎリズムにより文字列デヌタを分割しおいく必芁があるが、それが非垞に難しい䜜業になる。

 ・建物名の前は「?-?-?」になるケヌスが倚い
 ・建物名は「カタカナ」で始たる堎合が倚い

などの傟向はあるものの、絶察的な法則ではない。3䞁目などの「䞁目」がなく、4桁の地番がそのたた䜿われおいる䜏所もあるし、「☆☆荘」のように挢字で始たる建物名もある。

47個しかない「郜道府県」ず違っお「䜏所」はかなり自由床の高い文字列になるため、それを適切に分割するアルゎリズムは芋぀からない・・・、ずいう状況に陥っおしたう。この堎合、関数でデヌタを分割するこずは䞍可胜だ。

よっお、手䜜業でスペヌスを挿入しおいき、その埌、「区切り䜍眮」コマンドで2぀の列に分割する、ずいうのが珟実的な凊理方法になるかもしれない。実は、本連茉で䜿甚しおいるデヌタ衚も、前回たでは「建物名の前」にスペヌスが挿入されおいなかった。そこに手䜜業でスペヌスを挿入するこずにより、「区切り䜍眮」コマンドを利甚可胜な状態にしおいる。

文字列デヌタはどのように保管しおおくべきか

先ほど述べたように、文字列デヌタの分割・抜出は、必ずしも適切なアルゎリズムが芋぀かるずは限らない問題になる。䞀方、分割されおいるデヌタを1぀にたずめる「文字列の結合」は、どんな状況でも問題なく実行できる。文字を連結する「&」だけで解決できるケヌスが倧半を占めるずいえるだろう。

このような芖点で考えるず、再利甚する可胜性があるデヌタは「文字列デヌタを分割した状態」のたた保管しおおくのが基本ずいえる。文字列の結合は簡単に行えるが、いぢず結合しおしたった文字列を分割するのは非垞に難しい、もしくは「手䜜業でないず無理」ずいう状況になっおしたう。

文字列の分割・抜出が難しいこずを知っおいれば、デヌタの保管方法にも配慮できるようになるはずだ。

文字列デヌタの分割・抜出に䜿える関数

最埌に、今回の連茉の本題でもある「文字列の分割・抜出に䜿える関数」を簡単にたずめおおこう。

基本になるのは関数LEFT、RIGHT、MIDの3぀。「文字列の先頭」からN文字分を抜出したいずきは関数LEFT、「文字列の末尟」からN文字分を抜出したいずきは関数RIGHTを指定する。「䞭間にある文字」を抜出したいずきは関数MIDを䜿甚する。こちらは、N文字目からM文字分ずいう具合に2぀の数倀で䜍眮を指定する必芁がある。

◆関数LEFTの曞匏
 =LEFT(文字列, 文字数)

◆関数RIGHTの曞匏
 =RIGHT(文字列, 文字数)

◆関数MIDの曞匏
 =MID(文字列, 開始䜍眮, 文字数)

䞀郚の文字を眮換したり、削陀したりするずきは、SUBSTITUTEやREPLACEずいった関数を䜿甚する。「眮換前」の文字を「眮換埌」の文字に眮き換えるずきは関数SUBSTITUTE、眮換する䜍眮を「N文字目からM文字分」ずいう圢で指定するずきは関数REPLACEを䜿甚する。どちらも眮換埌の文字に「空文字」を指定するこずで、文字を削陀する関数ずしお利甚するこずが可胜だ。

◆関数SUBSTITUTEの曞匏
 =SUBSTITUTE(文字列, 眮換前, 眮換埌, [䜕番目])

◆関数REPLACEの曞匏
 =REPLACE(文字列, 開始䜍眮, 文字数, 眮換文字列)

これらの関数だけで実珟できる凊理は、比范的簡単な凊理ずいえる。そうでない堎合は、「キヌずなる文字が䜕文字目にあるか」、「党䜓の文字数は䜕文字か」などを調べおアルゎリズムを構築しおいく必芁がある。

「キヌずなる文字が文字目にあるか」を調べるずきは、関数FINDを䜿甚する。その結果は「N文字目」のNが数倀デヌタずしお返される。「党䜓の文字数は䜕文字か」は関数LENで調べられる。こちらはカッコ内にセル参照を指定するだけで、そのセルに入力されおいる文字数を数倀デヌタずしお取埗できる。

◆関数FINDの曞匏
 =FIND(キヌワヌド, 文字列, [開始䜍眮])

◆関数LEN
 =LEN(文字列)

これらの情報をもずに条件分岐するずきは、関数IFたたはIFSを䜿っお分岐凊理を実珟する。なお、関数FINDは「キヌワヌド」に指定した文字が芋぀からなかった堎合に゚ラヌが発生する仕様になっおいる。こういった「゚ラヌの堎合」の凊理を指定するずきに関数IFERRORを䜿甚する。

◆関数IFの曞匏
 =IF(条件, 真の堎合, 停の堎合)

◆関数IFERRORの曞匏
 =IFERROR(数匏・関数, ゚ラヌ時の倀・凊理)

ほかにも文字列の分割・抜出に掻甚できる関数は色々ずあるが、たずは䞊蚘で玹介した9個の関数の䜿い方をマスタヌしおおくこずをお勧めする。これだけでも、それなりに幅広い問題に察応できるようになるはずだ。それ以倖の関数は、必芁になった時点で「こんなこずを実珟できる関数たたはテクニックはないか」をネット怜玢しおみるずよいだろう。