0

我想问你一些已知的 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;
}

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

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

提前谢谢。

4

1 回答 1

0

对造成的不便表示歉意,

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

迭代器调用which SplFileObjectimplementsIterator和。它允许逐行读取文件。RecursiveIteratorSeekableIterator

更新和工作代码是:

$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;
}
于 2013-02-18T09:48:12.387 回答