Fortran Coder

查看: 15748|回复: 9
打印 上一主题 下一主题

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

[复制链接]

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

跳转到指定楼层
楼主
发表于 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



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

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

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

板凳
发表于 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,

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

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



37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

5#
 楼主| 发表于 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个,甚至更多,肯定不可能一个接一个的处理的,我可能还需要尝试其他方法。

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1341 元
贡献
565 点

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

6#
发表于 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

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

7#
 楼主| 发表于 2020-5-14 09:51:10 | 只看该作者
fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
[mw_shl_code=fortran,true]program wwlln_shiyan
  implicit none

学到了!!!感谢!

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

8#
发表于 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读入没问题

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

9#
 楼主| 发表于 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 给出的解决方法真的很好用。整个项目我已经做完了!
再次谢谢你!

14

帖子

1

主题

0

精华

入门

Gone with the wind~

F 币
66 元
贡献
31 点

规矩勋章

10#
发表于 2022-4-14 14:51:10 | 只看该作者
fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
[mw_shl_code=fortran,true]program wwlln_shiyan
  implicit none

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

评分

参与人数 1F 币 +1 收起 理由
青衣巷 + 1 是的,正是如此

查看全部评分

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-24 11:43

Powered by Tencent X3.4

© 2013-2024 Tencent

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