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:~$
コメント