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:~$


コメント