見出し画像

【JKI】002_Split File and Save into Subfolders

【Just KNIME It! (JKI)第2回】

第1回は正直惨敗感がありましたが、気にせずに次行きます。

今回の挑戦はこちら

Challenge 2: Split File and Save into Subfolders
Level: Easy
Description: A pharmaceutical company used to keep its sales data in a CSV file. They ask for your help to split the data into monthly CSV files and to save them into different subfolders, where each subfolder corresponds to a year. As an example, the data for January 2015 should be stored in a file named 2015/January.csv. In your solution, remember to save the files and subfolders in the workflow data folder.
Author: Emilio Silvestri
Dataset: Sales Data in the KNIME Hub

迷わずGoogle翻訳

課題2:ファイルを分割してサブフォルダーに保存する
レベル:簡単
説明:販売データをCSVファイルに保存していた製薬会社。彼らは、データを月次CSVファイルに分割し、それらを異なるサブフォルダーに保存するための支援を求めています。各サブフォルダーは1年に対応します。例として、2015年1月のデータは2015/January.csvという名前のファイルに保存する必要があります。ソリューションでは、ファイルとサブフォルダーをワークフローデータフォルダーに保存することを忘れないでください。

えっ簡単なんだ? と思いつつデータを入手。1枚のcsvファイルでした。

【入手したデータの格納先】

上の文を読んで
ワークフローデータフォルダーってどこですか?って思いませんでしたか。
私の解釈は以下の通りです。
今回作成したKNIME workflowの.knwfファイル内と解釈し、そこにdataフォルダを作って手作業でそこに上記の”sales_data.csv”ファイルを置きました。
ちなみに各自でknime-workspaceフォルダーの格納場所が違うので探していただく必要があります。

画像1

「分割してサブフォルダーに保存する」先は後ほど用意することにして次のステップへ。

【相対パスでのファイル読み取り

画像2

KNIMEでの相対パス利用についてはまたもまっきーさんの記事で勉強しました。

中級編で扱われてます。簡単とは私は思っていないです。

どう設定したかは以下の通り。

画像3

「Relative to」 「Current workflow data area」設定にして、「Browse」を押し、

画像4

で選んで「開く」

無事データは読み込めました。
ただし日付データが文字列扱いで、かつアメリカ式の記載になってます。

画像5

英語の日付の書き方:

【日付データをどう読み込むか】

各ステップで躓きながら進めています。
String to Date&Timeノードでは読み取り方を見つけられませんでした。

画像6

画像7

そこでCell Splitterで月/日/年を「/」で分けて3つのカラムにしました。

画像8

画像9

カラム名を変えて作業上わかりやすくしておきました。

画像10

画像11

画像12

月の名前を書き出しファイル名にするので、Table Creatorでリストを作ってJOIN処理しました。

画像13

画像14

多分他の方はもっとうまくやるんだろうなと思いつつ、これで必要な年月日のデータができました。

【格納先の文字列データ生成】

さらに、ファイル格納先のアドレスを定義するため文字列処理

画像15

join("Subfolder/",string($Year$),"/",$MonthName$,".csv")

Yearが整数値なので、String型に変換してから他の文字列と結合する必要がありますね。

画像16

格納先サブフォルダ名とファイル名データは”File”という名前のカラムにしました。
こちらが次のループ処理で重要です。

これで前処理が終了しました。

【格納先別にループ処理】

画像17

上図のように、”File”カラムのデータでグループ分けして、それぞれの格納先Pathを発生させたのち、もとのcsvにはなかったカラム群は不要なので削除してからCSVWriterで書き込みするという一連の処理を繰り返します。

このあたりは実際に動かしてみていただくのが良さそうなので、設定画面だけ列記します。

”File”カラムのデータでグループ分けして、ループ開始:

画像18

格納先Pathを発生:

画像19

画像20

相対パスで作ってます。


もとのcsvにはなかったカラム群は不要なので削除:

画像21

CSV Writerで書き込み:

画像22

画像23

繰り返し:

画像24

【出力されたファイル群を探しに行こう】

結果は、またknime-workspace内の.knwfデータのフォルダを見に行かないといけないです。アドレスは人それぞれです。

WF実行前にはなかったSubfolderが生成していて、

画像25

その中は年単位でフォルダができていて、

画像26

その中に月ごとにCSVファイルがあり、

画像27

それぞれ該当期間のデータだけがcsvファイルに格納されています。

画像28

【投稿して完了】

前回と同様にKNIME Hubへ投稿して完了。
もう恥はかき捨て感があって平気です。

すさんによると

今回*1は変数*2の使い方について、基本的な部分を書いてみようと思います。あまり馴染みのない方もいらっしゃるかもしれませんが、
• 変数なし:すべて徒歩でプレイ
• 変数あり:キメラのつばさ使える
くらいに幅が広がると思います。
(さらにループ処理ができればルーラですかね。

って言ってますよね。

特に相対パス指定とかが使えると、データもまとめて1つの.knwfファイルの共有だけで相手方の環境でも動かせるのは便利ですよね。

無事それっぽい解答ができて一安心。
他の方の美麗な解答を見るまでは幸福な時間を過ごせそうです。


記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。