Symfoware

Symfowareについての考察blog

PHP zipファイルを解凍せずにファイルの内容を読み取る

例えば、郵便番号情報のzipファイル
読み仮名データの促音・拗音を小書きで表記するもの(zip形式)

全国版のzipファイルは約2MBぐらいですが、展開すると約12MBのファイルになります。

692_01.png

zipファイルを解凍せずに中の「KEN_ALL.CSV」の内容を読み取れるか試してみます。




ZipArchive クラス



ZipArchiveを使用して、ファイルの読み取りを試してみます。


  1. <?php
  2. $zip = new ZipArchive();
  3. if (!$zip->open('ken_all.zip')) {
  4.     echo 'zipファイルのオープンに失敗しました。'.PHP_EOL;
  5.     exit(1);
  6. }
  7. // KEN_ALL.CSVというファイル名が取得できる
  8. $filename = $zip->getNameIndex(0);
  9. // ファイルポインタを取得
  10. $fp = $zip->getStream($filename);
  11. while (!feof($fp)) {
  12.     $line = fgets($fp);
  13.     echo $line;
  14.     break;
  15. }
  16. fclose($fp);
  17. $zip->close();




実行すると文字化けしています。

692_02.png


ファイルの内容はCP932なので、文字コードをmb_convert_encodingでUTF-8に変換。


  1. <?php
  2. $zip = new ZipArchive();
  3. if (!$zip->open('ken_all.zip')) {
  4.     echo 'zipファイルのオープンに失敗しました。'.PHP_EOL;
  5.     exit(1);
  6. }
  7. // KEN_ALL.CSVというファイル名が取得できる
  8. $filename = $zip->getNameIndex(0);
  9. // ファイルポインタを取得
  10. $fp = $zip->getStream($filename);
  11. while (!feof($fp)) {
  12.     // 文字コードを変換
  13.     $line = mb_convert_encoding(fgets($fp), 'UTF-8', 'CP932');
  14.     echo $line;
  15.     break;
  16. }
  17. fclose($fp);
  18. $zip->close();




これでzipファイル中のcsvファイルの内容がそのまま読み取れました。

692_03.png






fopen



PHPのstream wrapperをさわってみた


fopenで直接zipファイルの内容が読み取れますね。
http://php.net/wrappers.compression

プログラムを変更してみます。


  1. <?php
  2. // ファイルポインタを取得
  3. $fp = fopen('zip://ken_all.zip#KEN_ALL.CSV', 'r');
  4. if(!$fp) {
  5.     echo 'zipファイルのオープンに失敗しました。'.PHP_EOL;
  6.     exit(1);
  7. }
  8. while (!feof($fp)) {
  9.     $line = mb_convert_encoding(fgets($fp), 'UTF-8', 'CP932');
  10.     echo $line;
  11.     break;
  12. }
  13. fclose($fp);




ZipArchiveを利用した場合と同様の結果が得られました。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/05/22(日) 20:43:24|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python Query Builder「Orator」のインストールと使い方 | ホーム | jQuery + FileReader APIでファイルを分割し、バイナリでアップロード>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1891-e59f9060
この記事にトラックバックする(FC2ブログユーザー)