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 이면 마지막 줄에 도달했다는 의미 입니다.
! 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 이면 마지막 줄에 도달했다는 의미 입니다.
댓글
댓글 쓰기