정보

    • 업무명     : 포트란 텍스트 및 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
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기