FORTRAN(INDEXを連続で取得する)

FORTRANのcutコマンド続きです。
-bオプションのバイト数を2桁以上に対応するには、-(ハイフン)の位置を特定しなければなりません。INDEX関数を使って特定します。
INDEX関数の使い方は、引数に元の文字列と、検索文字列を指定すればよいです。

takk@deb9:~$ cat index.f
      CHARACTER*100 STRING
      STRING = '1,23,456,7890'
      IND = INDEX(STRING,',')
      WRITE(*,100) IND
  100 FORMAT(I3)
      END

takk@deb9:~$
takk@deb9:~$ gfortran index.f
takk@deb9:~$ ./a.out
  2
takk@deb9:~$

INDEX関数を二つ並べると、

takk@deb9:~$ cat index.f
      CHARACTER*100 STRING
      STRING = '1,23,456,7890'
      IND = INDEX(STRING,',')
      WRITE(*,100) IND
      IND = INDEX(STRING,',')
      WRITE(*,100) IND
  100 FORMAT(I3)
      END

takk@deb9:~$ gfortran index.f
takk@deb9:~$ ./a.out
  2
  2
takk@deb9:~$

このようにINDEX関数を二つ並べても結果は同じになります。次のカンマの位置はどう取得すればよいのでしょう。INDEXに開始位置はないものだろうか。

takk@deb9:~$ cat index.f
      CHARACTER*100 STRING
      STRING = '1,23,456,7890'
      IND = INDEX(STRING,',')
      WRITE(*,100) IND
      IND = IND + INDEX(STRING(IND+1:100),',')
      WRITE(*,100) IND
  100 FORMAT(I3)
      END

takk@deb9:~$

苦肉の策で部分文字列を抽出したものを検索元に置き換えてINDEXの引数に渡すことにしました。

takk@deb9:~$ gfortran index.f
takk@deb9:~$ ./a.out
  2
  5
takk@deb9:~$

カンマの位置は元文字列の’1,23,4~’と一致しました。結果は合ってそうです。
これをDOループで回してカンマの位置を全部取得するように修正します。

その前に検索しても見つからない場合は何が返るのでしょうか。検索文字列を変更して確認します。

(省略)
      IND = INDEX(STRING,':')
(省略)
takk@deb9:~$ ./a.out
  0
takk@deb9:~$

結果は0になりました。0ならループを終了するように作れば良いですね。

takk@deb9:~$ cat index.f
      CHARACTER*100 STRING
      STRING = '1,23,456,7890'
      IND = 0
  100 RSLT = INDEX(STRING(IND+1:),',')
      IF(RSLT.EQ.0) GOTO 300
      IND = IND + RSLT
      WRITE(*,200) IND
      GOTO 100
  200 FORMAT(I3)
  300 STOP
      END

takk@deb9:~$

発見されたかのチェックのため一旦結果をRSLTに格納して、後からINDに足すようにしました。
結果です。

takk@deb9:~$ gfortran index.f
takk@deb9:~$ ./a.out
  2
  5
  9
takk@deb9:~$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA