0

Stackoverflow の人たちの助けを借りて、ファイルから JSON コードを解析し、 「値」をデータベースに保存できるようになりました

しかし、私が読み込もうとしているファイルは、実際には 2GB の巨大なファイルです。私の Web サーバーはこのファイルを保持しません。ただし、ZIPPED バージョン (つまり 80MB) は保持されます (つまり .GZ)。

ZIPPED ファイル (.GZ) から JSON を解析する方法があると思います........誰か助けてくれますか?

私はこれを行うと信じている以下の関数を見つけました(私は思う)が、それを自分のコードにリンクする方法がわかりません

private function uncompressFile($srcName, $dstName) {
$sfp = gzopen($srcName, "rb");
$fp = fopen($dstName, "w");
while ($string = gzread($sfp, 4096)) {
fwrite($fp, $string, strlen($string));
}
gzclose($sfp);
fclose($fp);
}

私の現在のPHPコードは以下にあり、動作します。基本的な小さなファイルを読み取り、JSON がそれをデコードし (JSON は一連の個別の行にあるため、FILE_IGNORE_NEW_LINES が必要です)、値を取得して MySQL データベースに保存します。

ただし、Web サーバーの 100 MB のストレージを超えずに ZIPPED ファイルを読み取ることができるように、これら 2 つのコードを何らかの方法で組み合わせる必要があると考えています。

$file="CIF_ALL_UPDATE_DAILY_toc-update-sun";

$trains = file($json_filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($trains as $train) {
$json=json_decode($train,true);

foreach ($json as $key => $value) {

$input=$value['main_train_uid'];
$q="INSERT INTO railstptest (main_train_uid) VALUES ('$input')";
$r=mysqli_query($mysql_link,$q);
}
}   
}   
if (is_null($json)) {
die("Json decoding failed with error: ". json_last_error());
}
mysqli_close($mysql_link);

どうもありがとう

編集

JSON の短いスニペットを次に示します。これらのシリーズがあります

いくつかの重要な値を取得したいだけです。たとえば、値 G90491 と P20328 です。必要のない情報がたくさん

{"JsonAssociationV1":{"transaction_type":"Delete","main_train_uid":"G90491","assoc_train_uid":"G90525","assoc_start_date":"2013-09-07T00:00:00Z","location": "EDINBUR","base_location_suffix":null,"diagram_type":"T","CIF_stp_indicator":"O"}} {"JsonAssociationV1":{"transaction_type":"Delete","main_train_uid":"P20328"," assoc_train_uid":"P21318","assoc_start_date":"2013-08-23T00:00:00Z","location":"MARYLBN","base_location_suffix":null,"diagram_type":"T","CIF_stp_indicator":" C"}}

4

2 に答える 2

2

ファイルのストリーム抽出を行ってから、ストリーム JSON パーサーを使用できる場合があります。 ZipArchivegetStreamあり、誰かが PHP 用のストリーミング JSON パーサーを作成しました

データベースの値が見つかったときに挿入し、メモリを消費しないように不要な JSON を破棄するリスナーを作成する必要があります。

$zip = new ZipArchive;
$zip->open("file.zip");
$parser = new JsonStreamingParser_Parser($zip->getStream("file.json"),
    new DB_Value_Inserter);
$parser->parse();

あなたの質問に基づいて、zip ではなく gzip を使用しています。使用できるストリームを取得するには

fopen("compress.zlib://path/to/file.json", "r");

DB_Value_Inserter必要な JSON の形式を指定していないため、記述するのは困難ですが、おそらくListener::valueメソッドをオーバーライドして、受け取った文字列値を記述するだけでよいようです。

于 2013-08-31T14:07:36.137 に答える
0

PHP には、圧縮ファイルの行を開いて読み取るのに役立つ圧縮ラッパーがあります。1 つは gzip ファイルを読み取るためのものです。

$gzipFile = 'CIF_ALL_UPDATE_DAILY_toc-update-sun.gz';
$trains = new SplFileObject("compress.zlib://{$gzipFile}", 'r');
$trains->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD
    | SplFileObject::SKIP_EMPTY);

反復可能であるためSplFileObject、外側のforeachループをそのまま維持できます。もちろん、fgets()を使用する代わりに使用できSplFileObjectます。

于 2013-08-31T14:06:51.760 に答える