基于Parse制表的数据文件php

时间:2014-04-11 18:31:23

标签: php text-files symfony-2.4 fileparsing splfileobject

我有几个要解析的文件(使用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 个答案:

没有答案