首页 >

简单数据分割与“打点法”排序

作者:wangkeu  日期:09-16
来源:Fcode研讨团队
在读取文本文件的时候,表控格式(即*)显得十分方便。然而,表控格式常以空格、逗号、及tab作为数据分割的标志。实际上,部分观测数据常常保存了时间的记录信息,其分隔符可能是短杠(-),斜杠(/),或者冒号(:)。这使得难以直接使用表控格式读取数据,此时我们可以采用“字符串片段”操作,将这些分隔符替换成空格。

此外,观测数据常常具有“间隔等时连续”的特点,如果出现少测或者乱序的情况,可以采用“打点法”来补全数据,同时排序。“打点法”的基本思想在于:对号入座,亦即“一个萝卜一个坑”。人为给定正常顺序后,在对应位置填入相应数据即可。思路源于fcode群友,在此一并感谢。

相应数据文件:
input.txt 时间数据以-和:作为分隔符,且有少测,乱序。


大图

output.txt 时间数据以空格作为分隔符,便于表控读入。


大图

Program www_fcode_cn
  Implicit None
  Integer, External  :: GetFileN  !GetFileN函数用于获取文件行号
  Integer            :: nRow, i, j
  Character(len=100) :: str
  Integer r(8), pre(0:59)         !pre用于存放将使用的数据
  Open (12, File='/Users/input.txt')
  Open (13, File='/Users/output.txt')
  nRow = GetFileN(12)
  Write (*, *) '文件共', nRow, '行!'
  Do i = 1, nRow
    Read (12, '(A100)') str
    Do j = 1, len_trim(str)
      If ((str(j:j))=='-' .Or. (str(j:j)==':')) Then
        str(j:j) = ' '
      End If  ! if程序块用于将短杠和冒号换成空格,空格作为数据分割符
    End Do
    Write (13, *) str
  End Do
  Close (12)
  Rewind (13)
  pre = -99 ! 设定一个人为的缺测值
  Do i = 1, nRow
    Read (13, *) r(1:8)
    pre(r(6)) = r(8)  !r(6),r(8)分别存放 分钟和降水量。”对号入座”,填充数据
  End Do 
  ! 此后,pre中存放的数据将包括缺测值和观测数据,且按照时间已经排好序,在输出或者处理过程中
  ! 可以if判断,仅仅使用非缺测值(-99),或者将所有值输入到文件,来补全数据。
  ! 这种方法也可用于多年、月、日、时等数据的补全。缺测值可在计算有效数据的均值后,再重新赋予。
  Close (13)
  Write (*, '(10(1x,i4))') pre
End Program www_fcode_cn

Integer Function GetFileN( iFileUnit )
  ! 子程序GetFileN由Fortran Coder群主提供,群号2338021,特此感谢。
  ! // 此函数应在打开文件后立即调用。调用后读取位置返回文件起始位置
  Implicit None
  Integer , Intent( IN ) :: iFileUnit
  character( Len = 1 ) :: cDummy
  integer :: ierr
  GetFileN = 0
  Rewind( iFileUnit )
  Do
    Read( iFileUnit , * , ioStat = ierr ) cDummy
    If( ierr /= 0 ) Exit
    GetFileN = GetFileN + 1
  End Do
  Rewind( iFileUnit )
End Function GetFileN
常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航