†REXXのどろぬま†

拡張子の抽出

作成開始日 2014.11.01
最終更新日 2014.12.02

一般には、ファイル名「filename」に対して;
PARSE VAR filename body '.' ext
で拡張子「ext」を抽出できる。 しかし、ディレクトリ名に「.」が含まれる場合(URL形式)や、 ファイル名に「.」が複数含まれるような場合には、これは正しく機能しない。 一つの解決策は;
fname=FILESPEC('N',filename)
PARSE VAR fname body '.' ext
と下処理をしてパス部分を切除することだが、それでも複数「.」には対応できない。 そこで;
ext=SUBSTR(fname,LASTPOS('.',fname)+1)
のように、末尾の「.」を検索する方法がある。 ただし、この方法では拡張子を持たないファイル名には対応できない。 ファイル名がそのまま拡張子とみなされてしまう。 と言うことで、完全形(関数形式)はと言われると;
GetExt: PROCEDURE;
  filename=Arg(1);
  fname=FILESPEC('N',filename);
  IF POS('.',fname)=0 THEN ext=''
  ELSE ext=SUBSTR(fname,LASTPOS('.',fname)+1);
RETURN ext;
となるのだろうが、ちょっと仰々しすぎる。 現実的には、複数の「.」を含むファイル名は(私の環境では)滅多にないので;
fname = FILESPEC('N',filename)
PARSE VAR fname body '.' ext
で十分なような気もする。ちなみに、FILESPECの値を直接分解するときは;
PARSE VALUE FILESPEC('N',filename) WITH body '.' ext
とする。parse varではなく、parase value〜withという構文になる。


【REXXのどろぬま目次】 【ホーム】