[Fortran] 포트란 텍스트 및 CSV 파일에서 날짜 및 시간 읽기

 정보

  • 업무명     : 포트란 텍스트 및 CSV 파일에서 날짜 및 시간 읽기

  • 작성자     : 이상호

  • 작성일     : 2020-01-25

  • 설   명      :

  • 수정이력 :

 

 내용

[개요]

  • 안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.

  • 포트란 (Fortran)은 날짜 및 시간 유형을 제공하지 않기 때문에 "파일 읽는 방법"에 대한 문제점이 존재합니다.

  • 따라서 텍스트 및 CSV 파일 예시를 통해 시간 및 날짜 읽기에 대한 Tip을 드리고자 합니다.

 

 

[특징]

  • 다양한 기상 자료를 읽기 위해서 날짜 및 시간을 처리 기술이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

 

[기능]

  • 텍스트

  • CSV

 

[활용 자료]

  • 없음

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 작업 환경 구축

  • 소스 코드 컴파일 (ifort *.f90) 

  • 소스 코드 실행 (./a.out)

  • 실행 결과 확인

 

[사용 OS]

  • Linux (CentOS v7.0)

  • VMware Workstation Pro v15.5

 

[사용 언어]

  • Fortran (ifort v19.1.0.166)

 

 내용

[텍스트]

  • 대부분 기상 자료의 경우 날짜 및 시간에 따른 기상 정보가 포함되어 있습니다.

  • Fortran에서 파일 읽을 경우 날짜와 시간 라이브러리가 제공되지 않기 때문에 상당한 어려움이 있습니다.

  • 일반적인 날짜 및 시간 표현은 구분자 (-, /, :)를 이용하여 연도와 월 및 일로 표시합니다.

  • 즉 연도는 4자리 정수이고 월 및 일은 각각 2자리 (01, 04, 10, 12) 또는 2자리 (01, 12, 09, 31)를 차지합니다.

 

Date Time Value
2015-01-01 08:30:02    2.0
2015-04-12 13:33:45    2.4
2015-10-09 10:05:23    4.3
2015-12-31 06:11:14    2.1

 

  • 소스 코드

    • 각 행마다 열 포맷 (i4, 5(1x, i2), 4x, f3.1)으로 파일 읽기

    • 오류 발생 시 "File Read Error" 메시지 출력 및 프로그램 종료

    • 정상적으로 읽은 후에 "File Read Done" 메시지 출력

 

      program File_Read_Using_Text_Data

         implicit none

         integer(4) :: iYear, iMonth, iDay, iHour, iMinute, iSec, iErrCode
         real :: rVal

         open(11,file = 'Text_Data_From_Input.txt', action = 'read')
         read(11,*)

         do
            read(11, '(i4, 5(1x,i2), 4x, f3.1)', iostat = iErrCode, end = 999) iYear, iMonth, iDay, iHour, iMinute, iSec, rVal

            if (iErrCode == 0) then
               write(*, '(6i5, 2x, f3.1)') iYear, iMonth, iDay, iHour, iMinute, iSec, rVal
            else if (iErrCode > 0) then
               write(*, *) "File Read Error"
               exit
            endif

         end do

  999    write(*,*) "File Read Done"

         close(11)

      end program File_Read_Using_Text_Data

 

 

 

[CSV]

  • 앞서 텍스트의 경우 각 열마다 구분자 (,) 구분되지 않거나 월/일이 2자리 정수 고정되지 않을 경우에 사용할 수 없습니다.

  • 따라서 CSV에서는 각 행을 전체 문자열로 읽고 각 열마다 구분자 (/, -, :, ,)를 공백으로 변경하여 정보를 얻어야 합니다. 

 

Date Time   Value
2015-1-1, 08:30:02, 2.0
2015/4/12, 13:33:45, 2.4
2015-10-9, 10:05:23, 4.3
2015-12-31, 06:11:14, 2.1

 

  • 소스 코드

    • 각 행을 전체 문자열로 읽기

    • 각 열마다 구분자 (/, -, :, ,)을 공백으로 변경

    • 오류 발생 시 "File Read Error" 메시지 출력 및 프로그램 종료

    • 정상적으로 읽은 후에 "File Read Done" 메시지 출력

 

      program File_Read_Using_CSV_Data

         implicit none

         integer(4) iYear, iMonth, iDay, iHour, iMinute, iSec, iErrCode, iCount
         real rVal
         character(80) sRow

         open(11, file = 'CSV_Data_From_Input.csv', action = 'read')
         read(11, *)

         do
            read(11,'(a)', iostat = iErrCode, end = 999) sRow

            if (iErrCode == 0) then
               do iCount = 1, len_trim(sRow)
                  if (index('/-:,', sRow(iCount:iCount)) > 0) sRow(iCount:iCount) = ' '
               end do

               read(sRow, *) iYear, iMonth, iDay, iHour, iMinute, iSec, rVal

               write(*, '(6i5, 2x, f3.1)') iYear, iMonth, iDay, iHour, iMinute, iSec, rVal
            else if (iErrCode > 0) then
               write(*, *) "File Read Error"
               exit
            endif

         end do

  999    write(*,*) "File Read Done"

         close(11)

      end program File_Read_Using_CSV_Data

 

 

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com