정보
-
업무명 : 포트란 텍스트 및 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
'프로그래밍 언어 > Fortran' 카테고리의 다른 글
[Fortran] 포트란 Random 함수를 이용한 정규 분포 가시화 (0) | 2020.01.29 |
---|---|
[Fortran] 포트란 유닉스 시간 (Unix Time)을 날짜로 변환 (0) | 2020.01.28 |
[Fortran] 포트란 퇴각검색을 이용한 스도쿠 풀이 알고리즘 (0) | 2019.09.05 |
[Fortran, Gnuplot, ShellScript] 기상 자료를 이용한 통계 분석 및 가시화 (0) | 2019.09.01 |
[Fortran] 포트란 지상 관측소를 기준으로 근접한 1/4/9 위성 픽셀에 대해 평균 수행 (0) | 2019.08.25 |
최근댓글