Fortran Coder

查看: 102|回复: 8

[文件读写] 以逗号为分割的数据如何读取

[复制链接]

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

发表于 2020-5-13 15:54:56 | 显示全部楼层 |阅读模式
数据: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



回复

使用道具 举报

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-13 16:00:31 | 显示全部楼层
补充:我以上代码出来的结果是这样的: 2004                       戢三         2.1138223167426894E-317   0.0000000000000000        0.00000000
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL

107

帖子

2

主题

0

精华

大师

F 币
654 元
贡献
337 点

规矩勋章

发表于 2020-5-13 16:17:04 | 显示全部楼层
用格式读入,把
READ(11,*) wwlln_date,wwlln_time,lat,lon,timingerror
改成
READ(11,'(a27,f,f,f)') wwlln_time,lat,lon,timingerror ! wwlln_date,

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-13 17:33:02 | 显示全部楼层
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
可以看出,还是有一些误差,是我读取格式设置不对的原因导致的。我本人正在翻书中,也希望各位大佬不吝赐教!谢谢!



30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-13 17:38:05 | 显示全部楼层
另外数据原文是这样的: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个,甚至更多,肯定不可能一个接一个的处理的,我可能还需要尝试其他方法。

1516

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1293 元
贡献
867 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2020-5-14 08:09:52 | 显示全部楼层
这样做,就不需要替换逗号为空格了。
[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

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-14 09:51:10 | 显示全部楼层
fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
[mw_shl_code=fortran,true]program wwlln_shiyan
  implicit none

学到了!!!感谢!

107

帖子

2

主题

0

精华

大师

F 币
654 元
贡献
337 点

规矩勋章

发表于 2020-5-14 11:06:40 | 显示全部楼层
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读入没问题

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-14 19:22:16 | 显示全部楼层
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 给出的解决方法真的很好用。整个项目我已经做完了!
再次谢谢你!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-6-5 07:29

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表