以逗号为分割的数据如何读取
数据: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
补充:我以上代码出来的结果是这样的: 2004 戢三 2.1138223167426894E-317 0.0000000000000000 0.00000000
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL 用格式读入,把
READ(11,*) wwlln_date,wwlln_time,lat,lon,timingerror
改成
READ(11,'(a27,f,f,f)') wwlln_time,lat,lon,timingerror ! wwlln_date, 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
可以看出,还是有一些误差,是我读取格式设置不对的原因导致的。我本人正在翻书中,也希望各位大佬不吝赐教!谢谢!
另外数据原文是这样的: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个,甚至更多,肯定不可能一个接一个的处理的,我可能还需要尝试其他方法。 这样做,就不需要替换逗号为空格了。
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 fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
program wwlln_shiyan
implicit none
学到了!!!感谢!{:2_27:} 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读入没问题 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 给出的解决方法真的很好用。整个项目我已经做完了!
再次谢谢你! fcode 发表于 2020-5-14 08:09
这样做,就不需要替换逗号为空格了。
program wwlln_shiyan
implicit none
请问这个修改后的代码,是先将数据读取到字符串“cRead”中,然后通过自定义的子程序“parserRead”将字符串“cRead”视作一个内部文件进行读取吗?
页:
[1]