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


コメント