Fortran Coder

查看: 35110|回复: 14
打印 上一主题 下一主题

[文件读写] 关于读取指定行

[复制链接]

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
跳转到指定楼层
楼主
发表于 2017-3-4 16:42:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 wxy 于 2017-3-4 17:41 编辑

请问我想提取文件中的指定行数据,应该怎么改
[Fortran] 纯文本查看 复制代码
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

QQ截图20170304164156.png (40.32 KB, 下载次数: 536)

QQ截图20170304164156.png

QQ截图20170304171959.png (36.88 KB, 下载次数: 530)

QQ截图20170304171959.png
分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
15#
 楼主| 发表于 2017-3-5 17:33:05 | 只看该作者
本帖最后由 wxy 于 2017-3-5 22:16 编辑
li913 发表于 2017-3-5 16:49
array数组太大,600多G,内存不够用。allocate(array(2,m),site(m))

嗯嗯 成功了 谢谢 开始学着弄下一步

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
14#
发表于 2017-3-5 16:49:39 | 只看该作者
array数组太大,600多G,内存不够用。allocate(array(2,m),site(m))

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
13#
 楼主| 发表于 2017-3-5 13:58:56 | 只看该作者
本帖最后由 wxy 于 2017-3-5 14:01 编辑

vvt 发表于 2017-3-5 09:28
这个问题就复杂了。
如果数据量不大,可以用数组存储,然后查找(关于距离,因为有乘方的关系,所以计算速 ...


之前的代码是把经纬度分别放入两个数组,我想把经纬度放入一个二维动态数组再排序,但二维动态数组还不太会用出现了图片中的错误,麻烦帮我看一下怎么改
[Fortran] 纯文本查看 复制代码
program near
  implicit none
  integer m,i,k
  character(len=12) ::  country
  character(len=30) , allocatable :: site(:)
  real , allocatable ::  array(:,:)
  character(len=32) :: c
  open(8,file="soil.sol")
  open(10,file="find_close.txt")
  !read(8,*)m  !//m无法再文件中获取,需手动输入或获取文件行数减去3,得到。
  m=414503 !//m 此时的含义为,有多少个数据(而不是有多少行)
  allocate(array(m,m),site(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 ,array(i,i)


    write(10,*) trim(site(i)) , array(i,i)
  End Do O
end program near

[indent]

QQ截图20170305140026.png (35.69 KB, 下载次数: 389)

QQ截图20170305140026.png

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
12#
 楼主| 发表于 2017-3-5 13:08:24 | 只看该作者
本帖最后由 wxy 于 2017-3-5 14:03 编辑
li913 发表于 2017-3-5 12:07
如果满足下面的要求,可以多费点功夫做数据前期处理:
1、坐标数据量大,且短时间内不会改变;
2、频繁调用 ...

我现在正学着排序,然后我在想文件中经纬度是固定对应的,我的代码里把经度纬度分别放进两个动态数组里,如果这样排序是不是对应关系就打乱了,是不是可以把经纬度两个一维数组放进一个二维数组里再排序,直接把经纬度用二维数组进行读取,不知道我的想法对不对

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
11#
发表于 2017-3-5 12:07:13 | 只看该作者
如果满足下面的要求,可以多费点功夫做数据前期处理:
1、坐标数据量大,且短时间内不会改变;
2、频繁调用该功能;
3、对计算速度要求很高。

QQ截图20170305115617.png (24.6 KB, 下载次数: 354)

QQ截图20170305115617.png

评分

参与人数 1贡献 +3 收起 理由
vvt + 3 李老师给力

查看全部评分

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
10#
发表于 2017-3-5 09:28:19 | 只看该作者
这个问题就复杂了。
如果数据量不大,可以用数组存储,然后查找(关于距离,因为有乘方的关系,所以计算速度比较慢,可以只计算 X 的差和 Y 的差。效果也差不多)
如果数据量大,可以先对数组进行一次排序,然后二分法查找。

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
9#
 楼主| 发表于 2017-3-5 01:05:13 | 只看该作者
vvt 发表于 2017-3-4 22:31
是的,的确是因为类型不对。
"CHN003830" 不能直接被转换成 integer
"LO" 也是如此,如果你不需要它,可以 ...

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

QQ截图20170305010259.png (10.06 KB, 下载次数: 514)

QQ截图20170305010259.png

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
8#
 楼主| 发表于 2017-3-4 23:15:11 | 只看该作者
本帖最后由 wxy 于 2017-3-4 23:43 编辑
vvt 发表于 2017-3-4 22:31
是的,的确是因为类型不对。
"CHN003830" 不能直接被转换成 integer
"LO" 也是如此,如果你不需要它,可以 ...

嗯嗯 谢谢 成功了

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
7#
发表于 2017-3-4 22:31:56 | 只看该作者
是的,的确是因为类型不对。
"CHN003830" 不能直接被转换成 integer
"LO" 也是如此,如果你不需要它,可以不读它。

[Fortran] 纯文本查看 复制代码
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
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-23 17:25

Powered by Tencent X3.4

© 2013-2024 Tencent

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