wxy 发表于 2017-3-4 16:42:14

关于读取指定行

本帖最后由 wxy 于 2017-3-4 17:41 编辑

请问我想提取文件中的指定行数据,应该怎么改
program find_close
implicit none
integer m,i
integer ::sol , country
integer , allocatable :: site(:)
real , allocatable :: lat(:) , long(:)
open(8,file="soil.sol")
open(10,file="find_close.txt")
!read(8,*)m!//m无法再文件中获取,需手动输入或获取文件行数减去3,得到。
    m=414503 !文件行数
allocate(site(m),lat(m),long(m))

do i = 1,m
    if(mod(i-3,9)==0)then
    read(8,*) site(i) , country , lat(i) , long(i) , sol
    end if
enddo
write(10,*) site(i) , country , lat(i), long(i) , sol
end program find_close

vvt 发表于 2017-3-4 18:23:09

以下代码,会搜索文件中以 * 开头的行,并且读取它后面的第三行。(而其他无用的行有多少,无关精要)
program find_close
implicit none
integer m,i,k
integer ::sol , country
integer , allocatable :: site(:)
real , allocatable :: lat(:) , long(:)
character(len=32) :: c
open(8,file="soil.sol")
open(10,file="find_close.txt")
!read(8,*)m!//m无法再文件中获取,需手动输入或获取文件行数减去3,得到。
m=414503 !//m 此时的含义为,有多少个数据(而不是有多少行)
allocate(site(m),lat(m),long(m))
O:Do i = 1 , m
    do
      Read(8,'(a)',iostat=k) c
      if ( k/=0 ) exit O
      if ( c(1:1) == '*' ) exit
    end do
    Read(8,*)
    read(8,*) site(i) , country , lat(i) , long(i) , sol
    write(10,*) site(i) , country , lat(i), long(i) , sol
End Do O
end program find_close

wxy 发表于 2017-3-4 19:49:40

本帖最后由 wxy 于 2017-3-4 20:25 编辑

vvt 发表于 2017-3-4 18:23
以下代码,会搜索文件中以 * 开头的行,并且读取它后面的第三行。(而其他无用的行有多少,无关精要)

谢谢 我试了一下,出现整型错误,请问是不是integer,allocatable :: site(:)这里有问题因为文件中对应的是CHN+一串数字,我其实主要想提取出坐标经纬度lat、long和编号site ,这种情况应该改呢

vvt 发表于 2017-3-4 20:18:23

请上传一段数据文件,以便调试

wxy 发表于 2017-3-4 20:24:51

本帖最后由 wxy 于 2017-3-4 21:28 编辑

vvt 发表于 2017-3-4 20:18
请上传一段数据文件,以便调试
这是其中一段,谢谢。

wxy 发表于 2017-3-4 22:28:20

vvt 发表于 2017-3-4 20:18
请上传一段数据文件,以便调试

上传了一小段麻烦帮看一下 :-loveliness:

vvt 发表于 2017-3-4 22:31:56

是的,的确是因为类型不对。
"CHN003830" 不能直接被转换成 integer
"LO" 也是如此,如果你不需要它,可以不读它。

program find_close
implicit none
integer m,i,k
character(len=12) ::country
character(len=30) , allocatable :: site(:)
real , allocatable :: lat(:) , long(:)
character(len=32) :: c
open(8,file="soil.txt")
open(10,file="find_close.txt")
!read(8,*)m!//m无法再文件中获取,需手动输入或获取文件行数减去3,得到。
m=414503 !//m 此时的含义为,有多少个数据(而不是有多少行)
allocate(site(m),lat(m),long(m))
O:Do i = 1 , m
    do
      Read(8,'(a)',iostat=k) c
      if ( k/=0 ) exit O
      if ( c(1:1) == '*' ) exit
    end do
    Read(8,*)
    read(8,*) site(i) , country , lat(i) , long(i)
    write(10,*) trim(site(i)) , trim(country) , lat(i), long(i)
End Do O
end program find_close

wxy 发表于 2017-3-4 23:15:11

本帖最后由 wxy 于 2017-3-4 23:43 编辑

vvt 发表于 2017-3-4 22:31
是的,的确是因为类型不对。
"CHN003830" 不能直接被转换成 integer
"LO" 也是如此,如果你不需要它,可以 ...
嗯嗯 谢谢 成功了

wxy 发表于 2017-3-5 01:05:13

vvt 发表于 2017-3-4 22:31
是的,的确是因为类型不对。
"CHN003830" 不能直接被转换成 integer
"LO" 也是如此,如果你不需要它,可以 ...

还想请教一下另一个问题 我想实现输入一个经纬度跟提取到的坐标相匹配(如果刚好数值完全一样就匹配,如果没有就寻找最近的坐标),并把坐标相对应的编号输出也就是 “CHN003830”但我想不出怎么实现寻找最近的点

vvt 发表于 2017-3-5 09:28:19

这个问题就复杂了。
如果数据量不大,可以用数组存储,然后查找(关于距离,因为有乘方的关系,所以计算速度比较慢,可以只计算 X 的差和 Y 的差。效果也差不多)
如果数据量大,可以先对数组进行一次排序,然后二分法查找。
页: [1] 2
查看完整版本: 关于读取指定行