非プログラマーのためのインフォマティクス入門。(仮)

非プログラマーがインフォマティクスについて勉強したことを記録します。主にKNIMEというソフトを使用しています。

【KNIME】ノード紹介:Copy/Move Files 〜一括でファイル名を変換しよう〜

みなさん、こんにちは。10月になりましたね!

 

 今回の内容なんですが、一般的に使えそうな・TIPS的な感じのやつを考えた結果、ファイル名の一括変換に関して書いてみようと思います。

 

 Webで調べると、ファイル名の最後に連番をつけるような方法がよく紹介されています。Google先生の一番上に出てきたのは

121ware.com > サービス&サポート > Q&A > Q&A番号 018542

上記リンクの内容でした。

 

 KNIMEを使って同じこともできますが、それでは面白くないので、この記事では

ファイルの最終更新日と容量をファイル名に追加

をしてみようと思います。

<処理前>

f:id:sumtat:20171001195615p:plain

<処理後>

f:id:sumtat:20171001200502p:plain

(キャプチャの時間がずれているのは、ファイルを名前を変えて複製したからです)

 

さて、KNIMEのフローを見ていきましょう!

 全体としてはこんな感じです。

f:id:sumtat:20171001220709p:plain

いつものように順をおって見ていきます。

 

 まずはList Filesを使って、名前を変えたいファイル群のリストを作成します。今回の例では冒頭のキャプチャのようにtest2というフォルダ内のファイルについて処理するので、設定画面で"test2"の場所を指定します。今回はxlsファイルだけが対象なので、ついでにフィルタをかけました。

f:id:sumtat:20171001221216p:plain

実行すると、Location, URLという2種のカラムが出来上がります。

f:id:sumtat:20171001221518p:plain

いずれもstring属性のカラムですが後でやや不都合があるので、URLを"URI属性"のカラムに変更します。

 

String to URI

ほんと名前のままのノードです。KNIMEのノードは大体が名前のままです。

f:id:sumtat:20171001221650p:plain

 先ほど作成したカラムであるURLを対象に指定します。今回は新たにURIという名前のカラムを追加することにしました。上書きしたければreplaceです。カラム名を変えたければNameの中身を好きな名前に変えてください。

実行結果は次のようになります。

f:id:sumtat:20171001222002p:plain

File meta Info

このノードを通すと、ファイルのメタ情報を取得できます。

このノードはURI属性のカラムしか入力値として受け付けません。先ほど作成したURIカラムを指定して実行してみます。

f:id:sumtat:20171001222117p:plain

f:id:sumtat:20171001222429p:plain

サイズだったり、最終更新日時だったり、諸々の情報を取ってきてくれます。今回の目的を達成するためには赤枠内の情報が必要なのですが、時間の表示形式が気に入らないので、次のノードで調整します。

 

Time to String

 このノードでは時間属性カラムの内容を、形式を指定しながらstring属性のカラムに変更してくれます。

f:id:sumtat:20171001222839p:plain

変更したいカラムを指定して、Date formatを選びます。今回はyyyy-mm-ddを選びました。また、元のカラムと置き換えるならreplaceにチェックを入れてください。outputのカラム名はNew columun nameの部分に記述すればOKです(キャプチャのものはデフォルトのままです)。

f:id:sumtat:20171001223215p:plain

実行した結果です↑。最後にyyyy-mm-ddのカラムができています。まあ、今回のはテストデータなんで全部2017-10-01なんですけどね。

 

必要なものが揃ったので、新しいファイル名を作っていきます。

String Manipulationを使います。設定は次の通りです。

f:id:sumtat:20171001230000p:plain

 

 暗号みたいですが、そんなに難しくないので、ちょっと我慢して読んでください。

replace($URL$, ".xls", join("_",$Last modified_string$,"_",string($Size$),"_bytes.xls"))

 

もとのURL()の.xlsという文字列を(""で囲むと文字列を示す)

_yyyy-dd-mm($Last modified_string$)と_ファイルサイズ(string($Size$))と_bytes.xlsをくっつけた文字列で置き換える

という意味です。

ファイルサイズの部分ですが、Sizeは数字属性のカラムなのでString()をつけてやることで文字列に変えています。

file:/Users/sumtat/Desktop/test2/0.xls >> file:/Users/sumtat/Desktop/test2/0_2017-10-01_4608_bytes.xls

ということなんですが、分かりにくいでしょうか…。

出来上がったファイル名(パス)はfilename2として吐き出しました。

吐き出したfilename2は再度、string to URIを使ってURI属性カラムへと変更します。この際、outputのカラム名はURI2としました。

f:id:sumtat:20171001230602p:plain

 

Copy/Move Files

 元のファイルパス、実行後のファイルパスをそれぞれURI属性カラムとして指定し、ファイルの複製・移動を行うノードです。

f:id:sumtat:20171001230818p:plain

まずは、複製するのか、移動するのかを指定します(キャプチャでは複製)。

対象のファイル(元のファイル)のURIと、複製・移動処理実行後のファイルパス(今回は先ほど作成したURL2)を指定してapply-OKすれば、今回の目的は達成です!

 なお、記事のタイトルにはファイル名の書き換えとしましたが、同じディレクトリを選択してmoveにすれば実質、renameです。

 

いかがでしたか?

ファイルのメタ情報以外にも、ファイル中身(ループで読ませて抽出)などもファイル名にできますし、通し番号も末尾だけでなく先頭に持ってくることも可能です。

アルファベットの接頭字をつけたり、一定ファイル数ごとにその接頭字を変えることも可能です。

結局のところ、今回の記事内で言うところの

URI(元のファイルパス)・URI2(新しいファイルパス)を1つのテーブルにまとめることができれば、なんでも対応可能ということです。

 

あまり頻度は多くないかもしれませんが、お役に立てば幸いです。