splitといってもsplitコマンドではなく、文字列を区切り文字で分割するsplit関数のようなことができる関数をFORTRAN77でも作りたいと思います。
前回作ったプログラムをベースに、カンマ毎に文字列を抽出するプログラムを作ってみました。
takk@deb9:~$ cat split.f CHARACTER*100 SRC CHARACTER*10 DEST(10) INTEGER I,S1,S2,SRC_SIZE SRC = '1,23,456,7890,ABCDE,FGHIJK' IND = 0 I=1 100 RSLT = INDEX(SRC(IND+1:),',') IF(RSLT.NE.0) THEN S1=IND+1 IND = IND + RSLT S2=IND-1 DEST(I) = SRC(S1:S2) I = I + 1 GOTO 100 END IF DEST(I) = SRC(S2+2:) SRC_SIZE = I DO 400 I=1,SRC_SIZE WRITE(*,200) DEST(I) 400 CONTINUE 200 FORMAT(A) 300 STOP END takk@deb9:~$
ではこれを関数化します。splitされた文字列を配列に格納したいので、SUBROUTINEを使います。
takk@deb9:~$ cat split.f PROGRAM MAIN CHARACTER*100 STRING CHARACTER*10 SSTRING(10) INTEGER I,S1,S2,SSIZE STRING = 'A,BB,CCC,DDDD,EEEEE,FFFFFF,GGGGGGG' CALL SPLIT(STRING,SSTRING,SSIZE) DO 100 I=1,SSIZE WRITE(*,200) SSTRING(I) 100 CONTINUE 200 FORMAT(A) 300 STOP END SUBROUTINE SPLIT(SRC,DEST,SPLIT_SIZE) CHARACTER*100 SRC CHARACTER*10 DEST(10) INTEGER IND,S1,S2,RSLT,SPLIT_SIZE IND = 0 I = 1 20100 RSLT = INDEX(SRC(IND+1:),',') IF(RSLT.NE.0) THEN S1 = IND+1 IND = IND + RSLT S2 = IND-1 DEST(I) = SRC(S1:S2) I = I + 1 GOTO 20100 END IF DEST(I) = SRC(S2+2:) SPLIT_SIZE = I RETURN END takk@deb9:~$
カンマ限定のsplit関数になってしまいました。
結果です。
takk@deb9:~$ gfortran split.f takk@deb9:~$ ./a.out A BB CCC DDDD EEEEE FFFFFF GGGGGGG takk@deb9:~$
コメント