0

*.txt文章のファイルを解析するのに役立つ可能性のあるいくつかの既知のPHPライブラリについてお聞きしたいと思います。大きすぎるテキストファイルを解析する必要があるため、ストリームパーサー(文ごと)を作成することにしました。

次のように、ファイルを文ごとに繰り返すのはかなり良いと思いました。

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;
}

しかし、この場合、私は壊れた(途切れた)文になります。

誰かが私にいくつかの既存のライブラリまたはおそらく私のコードを修正する方法を提案できますか?

事前にThx。

4

1 に答える 1

0

ご不便をおかけして申し訳ありませんが、

いくつか掘り下げた後、私は解決策を見つけました... Spl lib ..

、、およびSplFileObjectを実装するイテレータが呼び出されます。また、ファイルを1行ずつ読み取ることができます。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;
}
于 2013-02-18T09:48:12.387 に答える