设为首页收藏本站
开启辅助访问
切换到窄版

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3063|回复: 0

为一个大的文本文件建立索引

[复制链接]
发表于 2012-1-5 10:02:04 | 显示全部楼层 |阅读模式
为一个文件建立索引,是为了方便读取文件的某一行。遍历一个很大的txt文件就为了读取几行数据,是很愚蠢的做法。于是一个大的txt文件建立以行数为index的索引是非常必要的。其实perl cookbook上面有实现方案,我先贴到这里:
建立索引:
  1. # usage: build_index(*DATA_HANDLE, *INDEX_HANDLE)
  2. sub build_index {
  3.      my $data_file  = shift;
  4.      my $index_file = shift;
  5.      my $offset     = 0;

  6.      while (<$data_file>) {
  7.          print $index_file pack("N", $offset);
  8.          $offset = tell($data_file);
  9.      }
  10. }
复制代码


读索引:
  1. # usage: line_with_index(*DATA_HANDLE, *INDEX_HANDLE, $LINE_NUMBER)
  2. # returns line or undef if LINE_NUMBER was out of range
  3. sub line_with_index {
  4.      my $data_file   = shift;
  5.      my $index_file  = shift;
  6.      my $line_number = shift;
  7.      my $size;               # size of an index entry
  8.      my $i_offset;           # offset into the index of the entry
  9.      my $entry;              # index entry
  10.      my $d_offset;           # offset into the data file
  11.      $size = length(pack("N", 0));
  12.      $i_offset = $size * ($line_number-1);
  13.      seek($index_file, $i_offset, 0) or return;
  14.      read($index_file, $entry, $size);
  15.      $d_offset = unpack("N", $entry);
  16.      seek($data_file, $d_offset, 0);
  17.      return scalar(<$data_file>);
  18. }
复制代码


主程序:
  1. open($fh,  "<", $file)         or die "Can't open $file for reading: $!\n";
  2. open($index, "+>", $file.idx)
  3.   or die "Can't open $file.idx for read/write: $!\n";
  4. build_index($fh, $index);
  5. $line = line_with_index($file, $index, $seeking);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|生物信息学论坛 ( 蜀ICP备09031721号  

GMT+8, 2017-3-26 01:38 , Processed in 0.095301 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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