Fortran Coder

标题: 以逗号为分割的数据如何读取 [打印本页]

作者: Zhuming    时间: 2020-5-13 15:54
标题: 以逗号为分割的数据如何读取
数据:2004/08/10,20:24:38.300966, 30.1426, 104.7854, 13.9,  52004/08/10,20:24:39.380542, 10.4838,  29.3264, 18.7, ...
TXT格式,在txt中没有对齐。我需要从很多这样的数据中提取出一些符合我需求的数据。数据描述:日期,时间,纬度,经度,误差值。数据比较乱,有的也有空格。
我尝试先读取一条数据,失败了,之前做的都是对齐的数据。代码也很不好意思的附上吧....
[Fortran] 纯文本查看 复制代码
program wwlln_shiyan
implicit none

!声明变量
character(len=20)::filename
character(len=20)::wwlln_date,wwlln_time
real(kind=8)::lat,lon
real::timingerror
integer::i

!读取文件
filename='A20040810.txt'
OPEN(11,file=filename,status='old',form='formatted')
OPEN(12,file='shiyan.txt',status='replace')
READ(11,*) wwlln_date,wwlln_time,lat,lon,timingerror
write(*,*)wwlln_date,wwlln_time,lat,lon,timingerror
write(12,*)wwlln_date,wwlln_time,lat,lon,timingerror
CLOSE(11)
CLOSE(12)

STOP
end




作者: Zhuming    时间: 2020-5-13 16:00
补充:我以上代码出来的结果是这样的: 2004                       戢三         2.1138223167426894E-317   0.0000000000000000        0.00000000
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL
作者: necrohan    时间: 2020-5-13 16:17
用格式读入,把
READ(11,*) wwlln_date,wwlln_time,lat,lon,timingerror
改成
READ(11,'(a27,f,f,f)') wwlln_time,lat,lon,timingerror ! wwlln_date,
作者: Zhuming    时间: 2020-5-13 17:33
necrohan 发表于 2020-5-13 16:17
用格式读入,把
READ(11,*) wwlln_date,wwlln_time,lat,lon,timingerror
改成

你好,感谢您的回复。我按照您的提示,修改为以下代码,输出结果已经很接近了,但还是有一些问题。我先附上代码及输出结果。
[Fortran] 纯文本查看 复制代码
program wwlln_shiyan
implicit none

!声明变量
character(len=20)::filename
character(len=20)::wwlln_date,wwlln_time
real::lat,lon
real::timingerror
integer::i

!读取文件
filename='A20040810.txt'
OPEN(11,file=filename,status='old',form='formatted')
OPEN(12,file='shiyan.txt',status='replace')
READ(11,"(A11,A16,F7.4,F9.4,F4.1)")wwlln_date,wwlln_time,lat,lon,timingerror
write(*,*)wwlln_date,wwlln_time,lat,lon,timingerror
write(12,*)wwlln_date,wwlln_time,lat,lon,timingerror
CLOSE(11)
CLOSE(12)

STOP
end

结果: 2004/08/10          20:24:38.300966        30.1425991       104.785400       13.0000000
对比原文:2004/08/10 20:24:38.300966 30.1426 104.7854 13.9
可以看出,还是有一些误差,是我读取格式设置不对的原因导致的。我本人正在翻书中,也希望各位大佬不吝赐教!谢谢!




作者: Zhuming    时间: 2020-5-13 17:38
另外数据原文是这样的:2004/08/10,20:24:38.300966, 30.1426, 104.7854, 13.9,  52004/08/10,20:24:39.380542, 10.4838,  29.3264, 18.7,  ......
我在txt中去除了所有的空格,然后将“,”替换为空格,操作结束后的数据为下:
                                     2004/08/10 20:24:38.300966 30.1426 104.7854 13.9 52004/08/10 20:24:39.380542 10.4838 29.3264 18.7 ......
而实际上,这样的文本我一共要处理5400个,甚至更多,肯定不可能一个接一个的处理的,我可能还需要尝试其他方法。
作者: fcode    时间: 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
[Fortran] 纯文本查看 复制代码
program wwlln_shiyan
  implicit none

  !声明变量
  character(len=512)::cRead
  character(len=20)::filename
  character(len=20)::wwlln_date,wwlln_time
  real::lat,lon
  real::timingerror
  integer::i

  !读取文件
  filename='A20040810.txt'
  OPEN(11,file=filename,status='old',form='formatted')
  OPEN(12,file='shiyan.txt',status='replace')
  READ(11,"(A512)") cRead
  call parserRead(cRead)
  write(*,*)wwlln_date,wwlln_time,lat,lon,timingerror
  write(12,*)wwlln_date,wwlln_time,lat,lon,timingerror
  CLOSE(11)
  CLOSE(12)
  
contains

  Subroutine parserRead(c)
    character(len=*) :: c
    integer :: i
    do i = 1 , len_trim(c)
      if( c(i:i) == '/' ) c(i:i) = '|'
    end do
    read(c,*) wwlln_date,wwlln_time,lat,lon,timingerror
    do i = 1 , len_trim(wwlln_date)
      if( wwlln_date(i:i) == '|' ) wwlln_date(i:i) = '/'
    end do
  End Subroutine parserRead
  
end program wwlln_shiyan

作者: Zhuming    时间: 2020-5-14 09:51
fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
[mw_shl_code=fortran,true]program wwlln_shiyan
  implicit none

学到了!!!感谢!
作者: necrohan    时间: 2020-5-14 11:06
Zhuming 发表于 2020-5-13 17:33
你好,感谢您的回复。我按照您的提示,修改为以下代码,输出结果已经很接近了,但还是有一些问题。我先附 ...

浮点数的格式读入不需要指定宽度
READ(11,"(A11,A16,F7.4,F9.4,F4.1)")wwlln_date,wwlln_time,lat,lon,timingerror
改为
READ(11,"(A11,A16,F,F,F)")wwlln_date,wwlln_time,lat,lon,timingerror
可以直接读入数据
原文件格式不需要处理空格和逗号,可以直接用
我用Inter Fortran9.0读入没问题
作者: Zhuming    时间: 2020-5-14 19:22
necrohan 发表于 2020-5-14 11:06
浮点数的格式读入不需要指定宽度
READ(11,"(A11,A16,F7.4,F9.4,F4.1)")wwlln_date,wwlln_time,lat,lon,ti ...

那应该是编译器的不同,我用的simply Fortran,这么写会报错,所以才指定宽度去写的。
不过 @fcode 给出的解决方法真的很好用。整个项目我已经做完了!
再次谢谢你!
作者: Rookie    时间: 2022-4-14 14:51
fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
[mw_shl_code=fortran,true]program wwlln_shiyan
  implicit none

请问这个修改后的代码,是先将数据读取到字符串“cRead”中,然后通过自定义的子程序“parserRead”将字符串“cRead”视作一个内部文件进行读取吗?




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2