FORTRAN 으로 CSV 파일 불러오기

CSV 형식은  Comma-Seperated Values 의 줄임말로서 데이터를 "," 로서 구분하는 포멧입니다. 여러가지로 엑셀파일 형식과 비슷하지만, 가볍고 널리쓰여지고 있습니다. 전체적인 전략은 먼저 파일을 불러온뒤, ROW와 COLUMN의 갯수를 세어서 행렬을 생성한후, 이 행렬에 데이터를 넣어주는 방식입니다. 이와 같은 방식으로 CSV 파일을 읽어오는 코드는 다음과 같습니다.

    ! Variables
    CHARACTER(128) :: BUFFER
    CHARACTER(32), ALLOCATABLE :: BUFFER_ARR(:)
   
    INTEGER STRLEN, ROWS, COLS, IDS
    REAL, ALLOCATABLE :: TABLE(:,:)
    INTEGER, ALLOCATABLE :: IDS(:), NIDS(:)
   
    OPEN(1, FILE='TwoCom8.CSV', STATUS='OLD', ACTION='READ')
    !COUNT THE NUMBER OF COLUMNS
    READ(1,'(A)') BUFFER !READ FIRST LINE WITH SPACES INCLUDED
   
    STRLEN = LEN(BUFFER) !FIND THE LENGTH OF THE FIRST LINE STRING
   
    COLS = 1
    DO I=1, STRLEN
        IF (BUFFER(I:I)==',') THEN
            COLS = COLS + 1
        END IF
    END DO
   
    ROWS = 1 !COUNT THE NUMBER OF LINES IN A FILE
   
    DO
        READ(1, *, IOSTAT=IO)
        IF(IO/=0) EXIT
        ROWS = ROWS + 1
    END DO
   
    PRINT *, 'THE NUMBER OF COLS :', COLS
    PRINT *, 'THE NUMBER OF ROWS :', ROWS
   
    ALLOCATE(TABLE(ROWS, COLS))
    ALLOCATE(BUFFER_ARR(COLS))
   
    REWIND(1) !GET BACK TO THE FILE BEGINNING
    DO I=1, ROWS
        READ(1,'(A)') BUFFER
        READ(BUFFER, *) BUFFER_ARR(:)
        DO J=1,COLS
            READ(BUFFER_ARR(J), *, IOSTAT=IO) TABLE(I,J)
            IF (IO>0 .OR. IO<0) THEN
                TABLE(I,J) = SQRT(-1D0)
            END IF
            WRITE(*, "(f8.3)", ADVANCE = "NO") TABLE(I,J)
        END DO
        PRINT *
    END DO

위에서  REWIND는 파일의 시작점으로 가라는 명령어입니다. READ 명령어에서 IOSTAT=IO 옵션이 있습니다. 읽기에 성공할 경우 IO는 0이며, IO>0 이면 읽어 오는데 실패한 경우입니다. IO<0 이면 마지막 줄에 도달했다는 의미 입니다.

댓글

이 블로그의 인기 게시물

[Linux, AIX] 사용자 계정 생성 및 설정

[AIX] rpm 설치와 rpm 으로 패키지 설치 및 삭제

Ubuntu 에서 Fortran 시작하기