FORTRAN(splitを作る)

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

Leave a Reply

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

CAPTCHA