2017-06-13

既存ファイルのZip圧縮・アーカイブ

FME のライターのうち、ファイルにデータを保存するタイプのフォーマットに対応するものは、出力先データセットを zip 形式で圧縮・アーカイブするオプションを持っており、必要に応じて、データ変換結果を圧縮・アーカイブした zip ファイルとして出力することもできます。

また、複数のファイルで構成される既存のデータセットについて、データの内容を変更する必要はないが、複数の zip ファイルに振り分けて圧縮・アーカイブしたいという場合には、Directory and File Pathnames [PATH] リーダーFile Copy [FILECOPY] ライターが効果的に使えます。

前回の「土地利用細分メッシュ (ラスター) データセットの作成 (2017-06-10)」のワークスペース例は、ディスクシステムのひとつのフォルダー内に、変換結果の全てのGeoTIFFファイル (全国の陸部のほぼ全域をカバーする1次メッシュ175区画分の土地利用細分メッシュGeoTIFFファイル x 175個) を出力しました。

今回は、それらのGeoTIFFファイルがすでにディスクに保存されている状態を出発点として、[PATH] リーダーと [FILECOPY] ライターを使い、1次メッシュ区画単位で、当該メッシュ区画に対応するGeoTIFFファイルといくつかの共通ファイルを zip 形式で圧縮・アーカイブするワークスペース例を紹介します。

圧縮・アーカイブ前: common_files フォルダーに共通ファイル一式、geotiff_files フォルダーに全てのGeoTIFFファイルが保存されているものとします。
















圧縮・アーカイブ後: 1次メッシュ単位で、GeoTIFFファイル1個 (1次メッシュ1区画分) と共通ファイル一式のセットをひとつの zip ファイルにアーカイブします。zip ファイル名は、アーカイブした GeoTIFF ファイル名の拡張子を除いた部分に ".zip" を連結した文字列、つまり L03-b-09_<1次メッシュコード>.zip とします。















FME 2017.0.1.1 build 17291

FMEワークスペース例



















1. GeoTIFFファイル情報の取得

[PATH] リーダー: 次のパラメーター設定により、geotiff_files フォルダー直下の全ての *.tif ファイルについて、フルパス、ファイル名等の情報を読み取り、それらの情報を属性として持ったフィーチャー (1ファイルあたり1フィーチャー) を出力します。
  • データセット: <geotiff_files フォルダーのパス>
  • Path Filter: *.tif
  • Allowed Path Type: FILE
AttributeKeeper: [PATH] リーダーは、指定したフォルダー内の各ファイルについて多数の情報を読み取り、path_ で始まる名前のフィーチャー属性に格納しますが、全ての情報が常に必要とは限りません。ここでは、後の処理で必要な情報を格納した次の属性のみを残し、他は削除しました。
  • path_unix: ファイルのフルパス (UNIXスタイル: パス区切り文字としてスラッシュ / を使用)
  • path_rootname: 拡張子を「除く」ファイル名 -> 拡張子 .zip を付加して zip ファイル名として使用
  • path_filename: 拡張子を「含む」ファイル名 -> 当該 GeoTIFF ファイルのアーカイブ名として使用

[PATH] リーダーが出力するフィーチャーは、パス区切り文字としてバックスラッシュ \ (日本語版Windowsのエクスプローラー等では、半角¥で表示される) を使用するWindowsスタイルのフルパスを格納した path_windows 属性も持っています。Windowsは、スラッシュ / とバックスラッシュ \ のどちらもパス区切り文字として取り扱うので、ワークスペースをWindows版FMEのみで実行する場合は path_unix, path_windows のどちらでも構いませんが、Mac版やLinux版で実行する場合は path_unix を使う必要があります。


2. 共通ファイル情報の取得

[PATH] リーダー: 次のパラメーター設定により、common_files フォルダー直下の全てのファイル、サブフォルダーについて、フルパス、ファイル・フォルダー名等の情報を読み取り、それらの情報を属性として持ったフィーチャー (1ファイル・フォルダーあたり1フィーチャー) を出力します。
  • データセット: <common_files フォルダーのパス>
  • Path Filter: *
  • Allowed Path Type: ANY
AttributeKeeper_2: 共通ファイルは各GeoTIFFファイルのアーカイブ先 (zip ファイル) に一緒にアーカイブするので、必要な情報は、ファイル・フォルダーのフルパスと、拡張子を「含む」ファイル名・フォルダー名のみです。
  • path_unix: ファイル・フォルダーのフルパス 
  • path_filename: 拡張子を「含む」ファイル名・フォルダー名
ListBuilder: 共通ファイルの情報を持ったフィーチャーはGeoTIFFファイル数分コピーし、それぞれのアーカイブ先 (zipファイル) に送る必要があります。この例では、共通ファイル情報を持ったフィーチャーは2つ (ファイル x 1, サブフォルダー x 1) 読み込まれますが、ListBuilder によってそれらの情報をリスト属性として持つ単一のフィーチャーに集約し、次の FeatureMerger で、拡張子を除くGeoTIFFファイル名 (アーカイブ先zipファイル名) を格納した path_rootname 属性を持った全てのフィーチャーに結合することにしました。

FeatureMerger: Requestor ポートに path_rootname (拡張子を除くGeoTIFFファイル名 = アーカイブ先zipファイル名) 属性を持ったフィーチャー (1フィーチャーが1GeoTIFFファイルに対応する)、Supplier ポートに ListBuilder が出力する単一のフィーチャー (全ての共通ファイル情報をリスト属性として持つ) を入力し、Join On パラメーターの Requestor 側、Supplier 側の両方に同じ定数値 (例: 1) を設定することにより、Supplier フィーチャーが持っているリスト属性を、全ての Requestor フィーチャーに無条件に結合します。

ListExploder: 共通ファイル情報を格納しているリストを展開することにより、個々のファイル・フォルダー単位のフィーチャーに分解します。各フィーチャーは、AttributeKeeper_2 によって残された2属性 path_unix, path_filename の他、path_rootname 属性 (拡張子を除くGeoTIFFファイル名 = アーカイブ先zipファイル名) を持つことになります。


3. Zip圧縮・アーカイブ

Sorter: GeoTIFFファイル情報を持っているフィーチャー、共通ファイル情報を持っているフィーチャーを、path_rootname 属性の値 (拡張子を除くGeoTIFFファイル名) でソートします。必須ではありませんが、次の [FILECOPY] ライターの処理の効率が、わずかながら良くなることが期待できます。

[FILECOPY] ライター: [FILECOPY] ライターは、ディスクシステム内のファイルのコピーや移動を行うものですが、出力先データセット名 (フォルダー名) の末尾に ".zip" を付加することにより、ファイルを zip 形式で圧縮・アーカイブした zip ファイルを作成する機能もあります。後述するように、Fanout Dataset オプションによって属性値に応じて出力先を振り分ける場合も、振り分け先のフォルダ名末尾に ".zip" を付加することにより、振り分け先ごとの複数の zip ファイルが作成できます。

まず、ライターフィーチャータイプの User Attributes タブで、filecopy_source_dataset 属性: コピー元ファイル・フォルダーパス、filecopy_dest_filename 属性: コピー先ファイル・フォルダー名 (zip 圧縮・アーカイブする場合は zip ファイル内のアーカイブ名) の値 (Value) を設定します。この例では、filecopy_dest_dataset は使用しません。

[FILECOPY] ライターフィーチャータイプ User Attributes の設定

  • filecopy_source_dataset <- path_unix: コピー元ファイルパス
  • filecopy_dest_filename <- path_filename: コピー先ファイル名 (アーカイブ名)























次に、Navigator ウィンドウで、次のようにライターのパラメーターを設定します。

[FILECOPY] ライターのパラメーター設定 (Navigator)


























ここで重要なのは、次の2つのパラメーターです。

Fanout Expression: path_rootname 属性の値 (拡張子を除くGeoTIFFファイル名) と ".zip" を連結する文字列式を設定することにより、GeoTIFFファイル、共通ファイルが、その zip ファイルに振り分けられてアーカイブされます。

Copy Source Folder: Yes を設定することにより、コピー元としてフォルダーのパスが渡されたときに、そのフォルダーと下位のファイル・フォルダーが、元の階層構造と同じ構造でコピーされます。このパラメーターは、[FILECOPY] ライターをワークスペースに追加する際に、Add Writer 画面 [Parameters] ボタンからパラメーター設定画面を開いて設定することもできます。


ワークスペースの実行結果は、冒頭「圧縮・アーカイブ後」スクリーンショットに示したとおりです。


FME のライターで作成した zip ファイルを Windows 7 エクスプローラーの「すべて展開」コマンドによって展開すると、展開後のファイル名内の日本語文字が文字化けすることがあります。これは Windows 7 の既知の問題に起因するものであり、次のウェブページで Microsoft から配布されている修正プログラムをインストールすることによって解消できます。

Japanese characters in file names are displayed as garbled text after you decompress a .zip file in Windows 7 or in Windows Server 2008 R2

Windows 8 以降では、この問題は生じません。

0 件のコメント:

コメントを投稿