首页 >

Fortran从文件读取日期和时间

作者:li913  日期:10-27
来源:竹叶知风飘@fcode
某些文件中常常包含日期和时间等有用信息,比如记录某天的降雨量,某一个地震的发震时刻等。初学者处理这类文件时,常会遇到如何读取日期和时间这个难题,因为fortran并不提供日期、时间类型。常见的日期时间表示方式有以下几种:
1、2015-01-01 08:30:02
2、2015-1-1 08:30:02
3、2015.01.12 08:30:02
4、2015.1.12 08:30:02
5、2015/10/02 08:30:02
6、2015/10/2 08:30:02
即:年、月、日之间可用横杠、点号或斜杠分隔,其中年占4位,月日各占2位(1,3,5)或占1-2位(2,4,6)。一般来说,在同一个文件中,分隔符是相同的,即不会出现同时使用横杠和斜杠的情形,这里只讨论以横杠分隔的情形。
当年、月、日、时、分、秒所占位数固定时(1,3,5),由于数据规整,可直接使用相应输入格式来读取。下面给出例子1:
输入文件:
日期 时间 震级
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
代码:
program test
    implicit none
    integer(4) YY, MM, DD, h, m, s, i
    real d
    character(80) cLine  
    open(11,file='1.txt',action='read')
    read(11,*)
    do 
        !(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2,4x,f3.1)
        read(11,'(i4,5(1x,i2),4x,f3.1)',iostat=i) YY, MM, DD, h, m, s, d
        if(i/=0) exit
        write(*,'(6i5,2x,f3.1)') YY, MM, DD, h, m, s, d
    end do
end program test

大图
当月、日所占位数不固定时,上面的代码就不适用了,此时需要先将每一行内容读取到字符串,通过处理字符窜来获得有用信息。我们先看例子2:
数据:
日期 时间 震级
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
代码:
program test
    implicit none
    integer(4) YY, MM, DD, h, m, s, i, j
    real d
    character(80) cLine  
    open(11,file='1.txt',action='read')
    read(11,*)
    do 
        read(11,'(a)',iostat=i) cLine
        if(i/=0) exit
        do j = 1, len_trim(cLine)
            if(index('/-:',cLine(j:j))>0) cLine(j:j)=' '
        end do
        read(cLine,*) YY, MM, DD, h, m, s, d
        write(*,'(6i5,2x,f3.1)') YY, MM, DD, h, m, s, d
    end do
end program test

大图
例2的编程思想是:
1、将整行信息读入字符串
2、将字符串中的横杠、斜杠和冒号替换为空格
3、使用内部文件读写,从字符窜读取信息。

总结:这里给出了两个读取日期和时间的例子,推荐使用例2的思想,因为例1仅针对数据规整的情况,而例2可处理不规整的数据,更具通用性。
例2中没有给出分隔符为点号的情形,是因为数据中同时存在小数点,也会被替换。这种情形稍微复杂,我们给出编程思路,读者可自行实现。
1、将整行信息读入字符串
2、使用内部文件读写,从字符窜读取震级数据
3、将字符串中的横杠、斜杠、点号和冒号替换为空格
4、使用内部文件读写,从字符窜读取日期和时间。
常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航