0

大量 (10000 以上) のリモート gzip ファイルを解析する必要があります。圧縮された各ファイルには、その内部 (おそらくフォルダー内) に CSV が含まれている必要があります。現在、本文を取得し、コンテンツ タイプを確認して解凍し、application/octet-stream.

質問: オクテット ストリームとは何ですか? また、その中のファイルやフォルダーを確認するにはどうすればよいですか?

    /** @var $guzzle \Guzzle\Http\Client */
    $guzzle  = $this->getContainer()->get('guzzle');
    $request = $guzzle->get($url);

    try {
        $body = $request->send()->getBody();

        // Check for body content-type
        if('application/z-gzip' === $body->getContentType()) {
            $body->uncompress(); 
            $body->getContentType(); // application/octet-stream
        }
        else {
            // Log and skip current remote file
        }
    }
    catch(\Exception $e) {
        $output->writeln("Failed: {$guzzle->getBaseUrl()}");
        throw $e;
    }
4

3 に答える 3

1

本文を格納する EntityBody オブジェクトは、ローカル ファイルのコンテンツ タイプのみを推測できます。応答の content-length ヘッダーを使用して、より正確な値を取得します。

このようなもの:

$response = $request->send();
$type = $response->getContentType();
于 2012-12-13T08:25:02.560 に答える
0

組み込みのgzuncompress関数を使用できるはずです。

http://php.net/manual/en/function.gzuncompress.phpを参照してください

編集:または、使用しているデータに応じて他のzlib関数。http://php.net/manual/en/ref.zlib.php

于 2012-12-12T23:43:39.280 に答える
0

シェルコマンドのようなものがあなたのために働くでしょう

shell_exec('gzip -d your_file.gz');

最初にすべてのファイルを特定のディレクトリに解凍してから、各ファイルまたは実行する必要のある計算を読み取ることができます。

補足として:

コマンドが実行される場所に注意してください (swith を使用して「そのディレクトリに解凍する」ように指示しないでください)。escapeshellarg も確認することをお勧めします ;-)

于 2012-12-12T23:37:03.820 に答える