空フォルダとそれ以外のフォルダをフォルダ分けする方法

306 views
Skip to first unread message

TJ

unread,
Oct 6, 2015, 4:08:34 AM10/6/15
to FMEユーザーフォーラム
Directory and File PathnamesリーダとFile Copyライダーを使ってフォルダ分けをしようとしています。

元フォルダの中に、更に複数のサブフォルダがあります。
やりたいことは以下となります。
1.空のサブフォルダの場合は空フォルダのままH:\FolderAにコピー
2.中にファイルが入っているサブフォルダの場合フォルダごとH:\FolderBにコピー

2について、path_extension空でないもので判定できますが、
1の空フォルダはどのように抽出すればいいのかなかなかいい方法思いつきません。
path_extension空で判定したら、親フォルダはそれに該当して、結果的に全てのフォルダとファイルがコピーされる。

空フォルダを抽出する方法を教えていただけますでしょうか。

TJ

unread,
Oct 6, 2015, 4:50:56 AM10/6/15
to FMEユーザーフォーラム
今回のサブフォルダは1階層だけですので、以下の方法で実現できました。

1.Directory and File Pathnamesリーダのfme_datasetを公開
2.Directory and File Pathnamesリーダの出力ポートにTester接続し、path_extensionは空でないを判定、
3.FeatureMergerに接続し、以下のように設定
  Passed→Requestor(Join On:fme_dataset)
  Failed→Supplier(Join On:path_windows)
4.UnreferenceポートにFile Copyライダーに接続して、path_windows→filecopy_source_datasetに接続

これでからのサブフォルダのみを抽出することができた。

多階層フォルダの場合もこの方法をベースに工夫すればなんとかできそうな感じがしますが、時間あるときまた試してみます。
他の何かいい方法があればぜひ教えていただきたいです。
  

Takashi Iijima

unread,
Oct 6, 2015, 4:51:42 AM10/6/15
to FMEユーザーフォーラム
サブフォルダが1段階だけ (サブフォルダの下にさらに子孫フォルダがない) ならば、次の方法が簡単です。

PATHリーダーで、ルートフォルダ以下の全てのファイル/フォルダのパスを読む (例: C:\root\**)。

Tester でフォルダパスとファイルパスに分ける (path_type = directory)。
--> ファイルパスは、そのまま File Copy ライターに送って出力先フォルダにコピーする。
# *.gdb など拡張子がついたフォルダ名もあり得るので、フォルダパスとファイルパスの分類は path_type 属性を見るのが確実です。

Tester の後に FeatureMergerを追加。
フォルダパス --> Requestor
ファイルパス --> Supplier
Join On
Requestor側: @Value(path_unix)/   ※フォルダパスの後にパス区切り文字 / を付加
Supplier側: @Value(path_directory_unix)  ※ファイルの親フォルダのパス (後にパス区切り文字 / がついている)
# Windows のパス区切り文字 \ は何かとトラブルのもとになるので、UNIX パスを使うのが良いと思います。

FeatureMerger の NotMerged ポートから出力されるフォルダパスが、空のフォルダのパスです。

サブフォルダが2段階以上の場合は、FeatureMerger では対応できません。
2段階以上の場合は、InlineQuerier で SQL 文を工夫すればできそうです。

Takashi Iijima

unread,
Oct 6, 2015, 4:53:58 AM10/6/15
to FMEユーザーフォーラム
おっと、入れ違いでしたね。
FeatureMerger を使う発想は同じです。
上記でもコメントしたように、フォルダパスかファイルパスかを見分けるには、path_type 属性を見るのが確実です。

TJ

unread,
Oct 6, 2015, 5:03:13 AM10/6/15
to FMEユーザーフォーラム
入れ違いでしたね。

確かにいっぱい属性があって、どれを使うのが迷っていました。
気が付きませんでしたが、path_typeを使えばた確実で簡単ですね。

いい勉強になりました。

Takashi Iijima

unread,
Oct 6, 2015, 5:22:07 AM10/6/15
to FMEユーザーフォーラム
InlineQuerier アプローチ。これなら、サブフォルダが何段階でも対応できると思います。

PATH リーダーフィーチャータイプの出力ポートに InlineQuerier (PATHポート) を接続。
InlineQuerier パラメーター設定画面で、空フォルダパス用の出力ポート (例: EmptyFolder) とファイルパス用の出力ポート (例: FilePath) を作成して、それぞれSQL文を設定する。

EmptyFolder 出力ポート用SQL文の例
-----
select a.*
from
(select * from PATH where path_type = 'directory') as a
left outer join
(select path_directory_unix from PATH where path_type = 'file') as b
on b.path_directory_unix like a.path_unix||'/%'
where b.path_directory_unix is null
-----

FilePath 出力ポート用SQL文の例
-----
select * from PATH where path_type = 'file'
-----

Takashi Iijima

unread,
Oct 6, 2015, 5:46:00 AM10/6/15
to FMEユーザーフォーラム
EmptyFolder ポート用のSQL文は、この方がちょっとだけ効率がよくなりそうです。

select a.*
from
(select * from PATH where path_type = 'directory') as a
left outer join
(select distinct path_directory_unix from PATH where path_type = 'file') as b

TJ

unread,
Oct 6, 2015, 7:25:23 AM10/6/15
to FMEユーザーフォーラム
InlineQuerierを使って曖昧マッチするというアプローチですね。これすごいですね、またいい勉強になりました。

いつもpath_directory_unixはどういうとき使うかと思っていますが、windowsパスだと¥がパスになるので、いろいろ予想外のことが起きる可能性がありますから、path_directory_unixを使ったほうがこのような問題避けられるということですよね。

Takashi Iijima

unread,
Oct 6, 2015, 7:47:23 AM10/6/15
to FMEユーザーフォーラム
Windowsは \ も / もパス区切り文字として扱いますが、UNIX系では / のみが有効です。
PATHリーダーが path_unix も作成する第一の理由は、FMEには Linux や MacOS 版もあるためだと思います。
FME Server (Linux版) で実行することを前提とするワークスペースでファイルパスを扱うときは、UNIXパス区切り文字を使うのが必須になります。

Windows環境でも、\ はパス区切り文字だけでなく、正規表現やスクリプトなど、いろんな場面で特殊な働きをする文字として利用されることがあります。
標準のトランスフォーマーで処理する限りは問題が起こることはないとは思いますが、念のため、ファイルパスを対象とする文字列処理をするときは、UNIXパスを使った方が余計な心配をしなくて済むのは確かです。

TJ

unread,
Oct 6, 2015, 8:24:21 AM10/6/15
to FMEユーザーフォーラム

LinuxとMacOS版のFMEも考慮しているのですね。
確かにUNIXパスのほうが楽な場合がありますので、今後パスを扱う場合、これを活用したいと思います。

今回のタイトルとあまり関係ないのですが、先ほどFile Copyライダーの情報を検索したら、飯嶋さんも回答している
FME Community Answersがみかけました。

試に以下の添付のような簡単なワークスペースを作成してみたら、問題なくCSVに記載のパスを作成できました。
既に知っているのかもしれませんが、とても面白いと感じたので、ご報告いたします。
File Copyライダーは思った以上強力で便利ですね。



Takashi Iijima

unread,
Oct 6, 2015, 8:42:14 AM10/6/15
to fm...@googlegroups.com
filecopy_dest_dataset にフォルダパスを渡せば、フォルダが作れるというわけですね。
警告メッセージ:
File Copy Writer: Skipped 1 features that were missing source datasets
が表示されるので想定されていない使用法かも知れませんが、働いてしまうのが面白い。
情報ありがとうございました。
Reply all
Reply to author
Forward
0 new messages