Разбор таблицы данных на основе php

У меня есть несколько файлов для анализа (с PHP), чтобы вставить их соответствующее содержимое в разные таблицы базы данных.

Первый пункт: клиент дал мне 6 файлов, 5 из них CSV со значениями, разделенными комой; Последняя не из той же базы данных, и ее содержимое основано на табуляции.

Я построил FileParser, который использует SplFileObject для выполнения метода в каждой строке содержимого файла (в основном, создайте Entity с каждым набором данных и сохраните его в базе данных с 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

0 ответов

Другие вопросы по тегам