【问题标题】:How can I read only parts of text file?如何只读取部分文本文件?
【发布时间】:2013-05-20 10:13:44
【问题描述】:

我有一个 PHP 脚本,它可以很好地处理大型文本文件,主要是日志文件。问题是大多数时候我只想要它的一部分,从一个分裂点到另一个分裂点。但是必须读取 2GB 的文本文件才能获取其中的一小部分,这会减慢处理速度。

有什么方法可以只读取部分文本而不必将整个文件读入内存?

数据是这样存储的:

|18.05.2013: some log info here...
|19.05.2013: some log info here...
|20.05.2013: some log info here...
|21.05.2013: some log info here...
|22.05.2013: some log info here...
| etc...

因此,如果我只想要“19.05.2012”,我仍然需要阅读所有其他文本。有什么办法可以让我只看那部分吗?

附:数据库不是一个选项,将文件拆分成更小的文件也是不切实际的。

【问题讨论】:

  • 你使用的是什么操作系统?
  • “数据库不是一个选项” - 为什么不呢?
  • 如果文件中的每条“记录”都是可变长度的,那么您无法知道要跳过多远。如果您事先建立某种索引,则可以,但在这种情况下似乎不值得。
  • 好吧,您必须通读它才能阅读部分内容。 fgets-ing 通过它不是一种选择吗?内存方面,它非常轻量级,如果你知道在某个点之后没有条目,你可以很快中止。此外,如果这是一个日志文件,一个不错的 logrotate 配置会很有帮助。

标签: php file text


【解决方案1】:

我想你正在寻找fseek

但是,您需要以第 X 个字符是第 Y 个数据的开头的方式来格式化您的数据。实际上,如果每个日志都可以具有相同的长度,这可能是一种有效的方法。否则,您仍然需要阅读每一行来搜索它。

让我们想象一下(未经测试,但只是为了让您入门):

function getDataFromFile($fileName, $start, $length) {
    $f_handle = fopen($filename, 'r');
    fseek($f_handle, $start);
    $str = fgets($length);
    fclose($f_handle);
    return $str;
}

然后:

$fname='myfile.txt';
$DATA_LENGTH = 50;
$wanted_data = 12;

$data = getDataFromFile($fname, $DATA_LENGTH*$wanted_data, $DATA_LENGTH);

我希望这会有所帮助。

【讨论】:

  • fgets($length);不起作用。 fgets($f_handle , $length);工作。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 2014-11-23
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多