Zhuming 发表于 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中没有对齐。我需要从很多这样的数据中提取出一些符合我需求的数据。数据描述:日期,时间,纬度,经度,误差值。数据比较乱,有的也有空格。
我尝试先读取一条数据,失败了,之前做的都是对齐的数据。代码也很不好意思的附上吧....
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:31

补充:我以上代码出来的结果是这样的: 2004                       戢三         2.1138223167426894E-317   0.0000000000000000      0.00000000
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL

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

Zhuming 发表于 2020-5-13 17:33:02

necrohan 发表于 2020-5-13 16:17
用格式读入,把
READ(11,*) wwlln_date,wwlln_time,lat,lon,timingerror
改成

你好,感谢您的回复。我按照您的提示,修改为以下代码,输出结果已经很接近了,但还是有一些问题。我先附上代码及输出结果。
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: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个,甚至更多,肯定不可能一个接一个的处理的,我可能还需要尝试其他方法。

fcode 发表于 2020-5-14 08:09:52

这样做,就不需要替换逗号为空格了。
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:10

fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
program wwlln_shiyan
implicit none


学到了!!!感谢!{:2_27:}

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

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

Rookie 发表于 2022-4-14 14:51:10

fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
program wwlln_shiyan
implicit none


请问这个修改后的代码,是先将数据读取到字符串“cRead”中,然后通过自定义的子程序“parserRead”将字符串“cRead”视作一个内部文件进行读取吗?
页: [1]
查看完整版本: 以逗号为分割的数据如何读取