免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3377 | 回复: 19
打印 上一主题 下一主题

读取文件如何接着上一次的进度 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-31 19:00 |只看该作者 |倒序浏览
类似这样的结构:
  1. while(<IF1>){
  2.     #进行一定处理   
  3.     while(<IF2>){
  4.         #进行一定处理;
  5.         last;
  6. }}
复制代码
现在希望当读取下一行IF1句柄的时候,再读取IF2时是从上一次last时终止的位置开始,而不用再从头读取,应该怎么实现呢?

论坛徽章:
0
2 [报告]
发表于 2013-05-31 19:18 |只看该作者

来人呀呀呀,这个功能相当重要,效率至少提高一百倍

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2013-05-31 19:20 |只看该作者
回复 1# raoweijian

It seems fine and no issue.
would you post your code?

$ cat a
a1
a2

$ cat b
b1
b2

$ cat get_ab.pl
#! /usr/bin/perl
use strict;
use warnings;

open IF1, "<", "a" or die "can't open a file\n";
open IF2, "<", "b" or die "can't open b file\n";

while(<IF1>){
  #进行一定处理   
  print;
  while(<IF2>){
    #进行一定处理;
    print;   
    last;
  }
}

$ perl get_ab.pl
a1
b1
a2
b2

论坛徽章:
0
4 [报告]
发表于 2013-05-31 19:30 |只看该作者
为什么觉得会从头读取????????

论坛徽章:
0
5 [报告]
发表于 2013-05-31 19:41 |只看该作者
回复 4# picbhan


目前情况是,要根据IF1的信息去IF2里面找对应信息,已知IF1里面的信息和IF2里面的信息相对位置是相同的,比如在IF1里面,第二行在IF2里面对应第二行,那么在IF1里面的第三行,就一定对应IF2里面第二行或者往下,绝对不会对应到第一行。

但是现在执行的效率,越到后面越慢,就可以看出应该是每次打开IF2都会重头读取,读取前面无意义的行浪费很多时间。
因为行数很多,几十万行,到后面效率几乎为0了。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
6 [报告]
发表于 2013-05-31 21:30 |只看该作者
回复 5# raoweijian


    用seek吧

论坛徽章:
0
7 [报告]
发表于 2013-06-01 08:35 |只看该作者
tell  + seek

论坛徽章:
0
8 [报告]
发表于 2013-06-01 08:59 |只看该作者
  1. [root@b ~]# cat a
  2. 1
  3. 2
  4. 3
  5. [root@b ~]# cat b
  6. a
  7. b
  8. c
  9. [root@b ~]# cat 3.pl
  10. #!/usr/bin/perl
  11. open $a,"./a";
  12. open $b,"./b";

  13. while(<$a>){
  14.         print;
  15.         seek($b,$tell,0);
  16.         while(<$b>){
  17.                 print;
  18.                 $tell=tell($b);
  19.                 last;
  20.         }

  21. }
  22. [root@b ~]# perl 3.pl
  23. 1
  24. a
  25. 2
  26. b
  27. 3
  28. c
  29. [root@b ~]
复制代码

论坛徽章:
0
9 [报告]
发表于 2013-06-03 14:21 |只看该作者
本帖最后由 raoweijian 于 2013-06-03 14:26 编辑

回复 8# wsxedcer

你的方法我试了,结果还是有点问题,是我之前忘了说明了。
现在有两个文件,一个是SNP说明文件,另一个是染色体对应scaffold的文件
如图



现在需要把每条SNP信息上的染色体坐标(对应第一列和第二列,表示哪条染色体的第几个位点)转换成对应scaffold上的坐标。
第二张图表示染色体上从第几个位点开始,到第几个位点结束,对应的scaffold名字,以及scaffold起止点(一般都是1开始)
按照你的方法,有一个问题,就是当下一条SNP信息与上一条SNP信息在同一个scaffold上的时候,则会被跳过,因为seek已经定位到下一行了,找不到该条SNP的坐标在scaffold上的信息。

有没有简便高效的方法解决这个问题呢?
ps(可否直接seek的时候,再往前推进1000个字节,对效率影响不大,但是会不会改变<>操作符一行一行读的特点呢?)

论坛徽章:
0
10 [报告]
发表于 2013-06-03 16:10 |只看该作者
谢谢大家的帮助,已经改好了。
用tell和seek,加了一点修改就好啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP