0

それぞれのコンテンツを異なるデータベーステーブルに挿入するために、(PHP で) 解析するファイルがいくつかあります。

最初のポイント: クライアントから 6 つのファイルが提供されました。5 つのファイルは値がカンマで区切られた CSV です。最後の 1 つは同じデータベースからのものではなく、その内容は集計ベースです。

SplFileObject を使用してファイル コンテンツの各行でメソッドを実行する FileParser を作成しました (基本的に、Symfony2 と Doctrine2 を使用して、各データセットでエンティティを作成し、データベースに永続化します)。

しかし、SplFileObject を使用して集計ベースのテキスト ファイルを解析することはできません。期待どおりにコンテンツを行に分割しません...

// In my controller context
$parser = new MyAmazingFileParser();
$parser->parse($filename, $delimitor, function ($data) use ($em) {
    $e = new Entity();
    $e->setSomething($data[0);
    // [...]
    $em->persist($e);
});

// In my parser
public function parse($filename, $delimitor = ',', $run = null) {
    if (is_callable($run)) {
        $handle = new SplFileObject($filename);
        $infos = new SplFileInfo($filename);

        if ($infos->getExtension() === 'csv') {
            // Everything is going well here
            $handle->setCsvControl(',');
            $handle->setFlags(SplFileObject::DROP_NEW_LINE + SplFileObject::READ_AHEAD + SplFileObject::SKIP_EMPTY + SplFileObject::READ_CSV);
            foreach (new LimitIterator($handle, 1) as $data) {
                $result = $run($data);
            }
        } else {
            // Why does the Iterator-way does not work ?
            $handle->setCsvControl("\t");
            // I have tried with all the possible flags combinations, without success...
            foreach (new LimitIterator($handle, 1) as $data) {
                // It always only gets the first line...
                $result = $run($data);
            }
            // And the old-memory-killing-dirty-way works ?
            $fd = fopen($filename, 'r');
            $contents = fread($fd, filesize($filename));
            foreach (explode("\t", $contents) as $line) {
                // Get all the line as I want... But it's dirty and memory-expensive !
                $result = $run($line);
            }
        }
    }
}

おそらくクライアントのファイルのひどいフォーマットに関連していますが、彼らとの長い議論の後、残念ながら、いくつかの許容できる理由(彼らの側の制約)のために、彼らは本当に私のために別のフォーマットを手に入れることができません.

ファイルは現在 49459 行の長さなので、このステップではメモリが重要だと思います。そのため、SplFileObject の方法を機能させる必要がありますが、その方法がわかりません。

ファイルの抜粋は、次の場所にあります: Data-extract-hosted

4

0 に答える 0