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、使用内部文件读写,从字符窜读取日期和时间。