EXCEL 絶対パスからファイル名のみ取り出す最速のやり方

 今日も見に来てくださって、ありがとうございます。石川さんです。

 先日、お仕事で調査をしているときに、EXCELで絶対パスからファイル名だけを切り取るのをどうやったらいいのかを調べるのに、ちょっと時間がかかってしまったので、まとめておきます。

やりたいこと

 以下のように、エクセルに書かれた絶対パスからファイル名を取り出す。

絶対パスからファイル名のみを取り出す

 Pythonならすぐにこんな感じでできちゃうのですけどねぇ。

In [1]: from os.path import basename
   ...: basename(r"C:\work\tmframework\modebi-fw\TMD\MODEBI_FW_サンプルデータ.xlsx")
Out[1]: 'MODEBI_FW_サンプルデータ.xlsx'

 ま、エクセルですばやくどうするのか、とういことですから、きっとエクセルの関数を使うのがよいでしょうねぇ。で、調べて見つかったのが二つありました。

短めのやりかた

 最初に見つけたのは、このやり方です。

=TRIM(RIGHT(SUBSTITUTE(B2,"\",REPT(" ",100)),100))

 中身を説明すると、SUBSTITUTE関数で、区切り文字の「\」を空白100文字に置き換えて、右から100文字切り取って、そのあと空白を消す、という感じです。SUBSITUTE関数は、第一引数の文字列から、第二引数の文字列を探し出して、第三引数に置き換える関数です。REPT()関数は第一引数(この場合は半角スペース” “)を第二引数の個数分繰り返す関数で、100文字分の半角スペースを作っています。100文字を超えるファイル名の場合は使えないやり方ですが、Windowsではきっと問題ありませんね。ちょっとトリッキーなやり方だと思いますが、割と短く書くことができる、良いやり方だと思いました。ただ、「100」はあんまり好きじゃないのですよねぇ。

正統派(?)なやり方

 そして、もうちょっと探して見つけたのが次のやり方です。

=MID(B3,FIND("*",SUBSTITUTE(B3,"\","*",LEN(B3)-LEN(SUBSTITUTE(B3,"\",""))))+1,LEN(B3))

 こちらも説明すると、最後の区切り文字「\」を探して、「*」に置き換えて、「*」から最後までを切り出す、という感じですね。「*」に置き換えるのは上記と同様にSUBSTITUTE関数を利用していますが、秀逸なのは、「最後の」を決めるところですね。ここで「LEN(B3)-LEN(SUBSTITUTE(B3,”\”,””)))」とやっていますが、全体の文字数から、「\」を取り除いた文字列の文字数を引くことで、「\」の個数を求めています。いや、最初に思いついた人、天才かも。ただ、ちょっと長くて難しいのですよねぇ。

決定版

 で、関数を使ってファイル名を取り出すもっと美しい方法はないのかと、調べていたのですけど、最初に関数でどうやるのか、と、考えていたのが間違いでした。これって、実は、ぼくはこんなに難しいことができますよ~、という自慢でしかないのでした。

 と、いうことで、反省しました。これが恐らくいちばん簡単ではやい方法です。パスを選択して、「*\」で置換を使います。これで一発解決です。ものの数秒で解決しました。

絶対パスからファイル名のみを取り出す

 説明すると、検索する文字列に指定した「*」はワイルドカードと言って、0文字以上のすべての文字に一致する、という意味になります。なので、最初の例で言うと、まず「C:\」が置換されます。置換後の文字列は未入力なので、置換される、と言っても消去されます。次に、「work\」が消去され、「tmframework\」「modebi-fw\」「TMD\」と、次々に消去されて、「MODEBI_FW_サンプルデータ.xlsx」が残ります。

まとめ

 あまり技術力にこだわり過ぎないほうがよいかも。時には柔軟な発想でやりましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。