この記事で扱っていること
- 指定したファイル名に拡張子を自動的につける方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
プログラムを実行し得られた結果を保存する際には、必ずファイル名を指定する必要があります。
もちろんファイル名をプログラム的に自動で生成することもあると思いますが、ユーザーに任意のファイル名を指定させる場合もあると思います。
しかし、ユーザーがどのような入力をするかはわかりません。例えば本来拡張子csvをつけた状態でファイル名入力してほしいのに、拡張子がついていない、あるいは別の拡張子をつけてしまう場合も考えられます。
そこで、そういったヒューマンエラーが起きても対応できるようにファイル拡張子がついていなかったり別のものがついている場合には強制して拡張子をつけるような方法を考えました。別の拡張子がついている場合には、敢えてその拡張子のまま受け付ける、という場合も想定します。
どんな結果になるか
ファイル名を入力する、および指定したい拡張子を入力する制御器と、プログラムの結果を示す表示器、そして、拡張子を強制するかどうかのブールで構成しています。拡張子の部分はブロックダイアグラム上で定数として指定する、ハードコードでも良かったのですが、サブVIとして使用するようなイメージとして、敢えて外部から拡張子も柔軟に指定できるようにしました。
このサンプルでは拡張子をcsvにすることを想定しています(もちろん他の拡張子にもすることもできます)。入力に応じて以下のような結果となるように組みました。
プログラムの構造
ブロックダイアグラムは以下の図のような形としました。ファイル拡張子を取得する関数を使用して、拡張子部分がそもそも入力されているか、いないのかを判断します。
また、入力されていた場合には、その拡張子でいいのかあるいは強制するのかでまた場合分けが発生します。ケースストラクチャを使用することもできますが、一目で場合分けそれぞれの結果がわかりやすい選択関数を使用しました。
もっとヒューマンエラーを防ぐ
このサンプルの構造であれば、ユーザーがファイル名を入力さえしていれば問題は起こりません。が、ファイル名の入力すら忘れてしまっている場合にはただの「.csv」などというファイル名になってしまいます。
これでは困る、ということで、ユーザーがファイル名入力すら忘れてしまうという状況を想定するのであれば、例えば最初のファイル名入力の時点で場合分けを行います。
これでめでたしめでたし・・・と考えてもいいのですが、この方法だと、ファイル名が入力されない場合常にexample.csvなどという固定のファイル名になるため、上書きされることになりかねません。例えば連続でファイル名が入力されなかった場合を考えて、個々のファイルを分けるような仕組みを作ることもできます。
どこまでユーザーの「誤操作」を想定すればいいかについては悩ましいかもしれませんが、なるべくエラーの起こらない形で実行できるように実装時に工夫できる部分は工夫して快適に使用できるように心がけられればと思います。
ここまで読んでいただきありがとうございました。
コメント