【问题标题】:PHP: text fil esentence iteratorPHP:文本文件语句迭代器
【发布时间】:2013-02-18 09:35:21
【问题描述】:

我想问你一些已知的 PHP 库,它们可以帮助我解析 *.txt 文件中的句子。 我要解析太大的文本文件,所以我决定做一个流解析器(逐句)。

我认为逐句迭代文件会很漂亮,例如:

foreach (new SentenceIterator("./data/huge.txt") as $sentence)
{
    // do something...
}

主要思想是文件应该完全加载到内存中。

我尝试过的:

$f = fopen("./data/huge.txt", "r");
$dataBytes = 64;
$buffer = '';

while (!feof($f))
{
    $data = fread($f, $dataBytes);
    $dotPosition = strpos($data, '.');

    if (false !== $dotPosition)
    {
        $sentence = $buffer . substr($data, 0, $dotPosition);
        // correct cursor position
        fseek($f, -1 * $dotPosition, SEEK_CUR);
        // clear buffer
        $buffer = '';
        continue;
    }

    $buffer .= $data;
}

但在这种情况下,我得到了损坏(中断)的句子。

有人可以建议我一些现有的库或者如何修复我的代码吗?

提前致谢。

【问题讨论】:

    标签: php parsing text stream


    【解决方案1】:

    很抱歉给您带来不便,

    经过一番挖掘,我找到了解决方案……Spl lib..

    称为SplFileObject 的迭代器实现了IteratorRecursiveIteratorSeekableIterator。它允许逐行读取文件。

    更新和工作代码是:

    $file = new SplFileObject('./data/test.txt');
    $file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY);
    $buffer = '';
    
    foreach ($file as $lineNumber => $line)
    {
        $dotPos = strpos($line, '.');
        if (false !== $dotPos)
        {
            $sentence = $buffer . substr($line, 0, $dotPos);
            echo $sentence . "\n";
            $buffer = substr($line, $dotPos);
            continue;
        }
        $buffer .= $line;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多