MENU

    >TOP

    >>文字列精査

    >>カンマ区切り抽出
     (nカラム目抽出)


    >>IN句上限を考慮した
     SQL生成


    >>不要な行削除
    (作成中)

    >>Oracle SQL IN句


    >>日付の計算
    (作成中)

    >>時間の計算
    (作成中)


    >お問い合わせ

    区切り文字データ抽出

    やりたいこと

    <区切り文字データ> <抽出>
    00001,田中,09000000000,120000,20121101
    00002,鈴木,09000000001,10150,20130110
    00003,佐藤,09000000002,15000,20130215
    00004,井上,09000000003,97,20130301
    田中
    鈴木
    佐藤
    井上

    カンマ区切りデータなど、特定の文字で区切られたレコードから必要なカラムだけ抽出するといった関数がありそうでなかったので、実現させてみました。

    ポイントとしては、最終的な抽出は MID関数 により範囲していにてピンポイントで抽出します。 そのためには、nカラム目のデータが何文字目〜何文字という情報が必要になってきます。 そこで、登場するのが、 SUBSTITUTE関数 と FIND関数 です。

    FIND関数

    指定した文字列を他の文字列内から検索し、その検索文字列の位置を返します。
    ということは、単純にカンマで検索すればと思う人もりかもしれませんが、ここで壁が。。。
    カンマ区切りのデータをカンマで検索すると、1カラム目と2カラム目の間のカンマしか検索ができません。

    そこで役に立つのが...

    SUBSTITUTE関数

    検索文字列で指定した文字列が複数含まれている場合は、置換対象で何番目の文字列を置き換えるか指定する事ができます
    もうおわかりですね?

    SUBSTITUTE関数 で何番目の区切り文字かを検索し、そのレコードに含まれない文字列に置換してしまえば、あとは FIND関数 を用いて、何文字目かを特定すればいいのです。

    では、レコードに含まれない文字はケースバイケースになってくるかと思いますが、
    私の場合は、"改行"に置換をしています。

    実践

    では具体的にどうやって対象カラムを抽出しているかここから書いていきます。

    <対象レコード> <抽出>
    00001;田中;09000000000;120000;20121101 田中

    例えば上記のような;(セミコロン)区切りレコードがセルA1に入っているとします。
    ここでは2カラム目"田中"、を抽出しようとします。(今回は改行に一旦置換します)

    @開始位置の取得
    FIND(CHAR(10), SUBSTITUTE(";"&A1&";", ";", CHAR(10), 2), 1)

    A終了位置の取得
    FIND(CHAR(10), SUBSTITUTE(";"&A1&";", ";", CHAR(10), 2 + 1), 1)

    B2カラム目抽出
    MID(A1, @, A - @ - 1)

    ※SUBSTITUTEの検索される文字列(A1)の前後に区切り文字";"を付与しているのは、1カラム目検索または最終カラム目の検索にも対応できるためです。

    参考シート

    カンマ区切り抽出の参考ファイルを作成してみました。
    サンプルファイルをDL

    おすすめ

    書籍

    一冊あるだけでだいぶちがいますよね!
    特にマシン室で作業しているときは、ネット検索できないので強い味方ですね!

    ソフト

    Officeは仕事の定番ソフト!

    inserted by FC2 system