Разбор таблицы данных на основе 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