CSV結合ツールを自作しよう!(第3回・全ソースと解説編)

プログラミング入門
この記事は約5分で読めます。

では、CSV結合ツールの解説に入りたいと思います。

今回は、全ソースの掲載と、ファイル選択ダイアログ、フォルダ選択ダイアログを表示する方法に関する部分です。

全体のソースコード

全体のソースコードは以下の通りです。

今は中身が理解できないと思いますので、ここでは全体の雰囲気を把握するという意味で、軽く目をとおしていただければ結構です。

Visual Studio 2019 のプロジェクトファイル一式は、下記からダウンロードできますので、入力が面倒という方はご利用ください。

先頭のusing 宣言

まず、先頭のusing ですが、9行まではVisual Studio が自動で追加してくれます。

10行目の using System.IO はファイルを読み書きするためのクラスなので、今回手で追加したものです。

コンストラクタ

まず最初にコンストラクタの解説です。

ここでは、コンボボックスの初期設定を行っています。

具体的には、選択項目を登録し、最初の候補(shift-jis)を選択状態にしています。

フォルダとファイルの選択イベントハンドラ

結合対象フォルダの選択ボタンを選択した場合、フォルダ選択ダイアログを表示しますが、それが以下のコードになります。

まず、ファイル選択ダイアログのインスタンスを生成するため、FolderBrowserDialogクラスをNewしていますが、そのタイミングで{ } にプロパティの初期設定を記述しています。

SelectedPathはFolderrowserDialogのプロパティで、通常は選択したフォルダ名が格納されます。

逆に、インスタンス生成時に任意のフォルダを代入しておくことで、そのフォルダが選択された状態でダイアログが表示されるようになります。

そして、ShowDialogメソッドを読んで画面にダイアログを表示し、何らかのボタンが押されて制御が戻ってきたとき、その結果OKボタンが押されていたなら、uxTargetFolderというTextboxコントロールに、選択したフォルダ名を代入しています。

同様に、ファイル選択ダイアログについても同じ方法で表示とボタンの判定、選択結果の取得を行っています。

ファイル選択ダイアログには Filter というプロパティがあり、ここにフィルター条件を登録しておくことで、ファイル選択味に関係のないものを表示しないようにしています。

書式はタイトルとフィルター条件を縦棒 ‘|’ で区切ります。

例えば、

と記述すると、ダイアログには “csv” と”全てのファイル” が選択できるようになり、”csv”を選択すると、 *.csv というフィルター条件にヒットしたファイル名だけがダイアログに表示されます。

結合実行ボタンクリック処理

結合実行ボタンをクリックした際、まずヘッダ行数、結合対象の文字コード、出力CSVの文字コードを画面から取得します。

次に、結合対象フォルダに格納されているファイルの一覧を読み出し、files変数に格納しています。

次のソースコードが今回のポイントとなる部分で、first_file_flg という変数にtrue を代入しています。

フラグを使った1個目と2個目以降の判定

この変数は、読み込んだファイルが1個目なのか、2個目以降なのかを識別するためのものです。

この様に2つの状態のどちらであるかを表現するための変数を「フラグ変数」と呼んでいます。

このフラグは初期状態として true をセットしておき、1個目を読み込んだ時点でfalse に設定します。

こうすることで、1個目のファイルならヘッダを含めて出力し、2個目以降ならヘッダを抜いて出力するという制御が可能となります。

それでは、具体的に1個目と2個目以降についての処理を見ていきましょう。

1個目と2個目以降の処理分岐

以下はループ処理でファイルを順次読み込み、1個目か2個目以降かを判断し、処理を分けている部分です。

ファイルの読み込みは File.ReadAllLinesメソッドを、ファイルの書き込みは File.WriteAllLinesメソッド、File.AppendAllLines メソッドを使っています。

いずれも引数に文字コードをセットすることができますので、今回はComboboxのText部に設定されている文字コード名をセットしています。

WriteAllLineメソッドとAppendAllLinesメソッドの違いは、前者が既存のファイルに対して上書きするのに対し、後者は追加をしてくれるという点です。

既存ファイルがあった場合は追加せず作り直したいので、1個目のファイルはWriteAllLinesを使っています。

ヘッダ削除のためListクラスに変換

ReadAllLinesは読み込んだファイルを文字列の配列として返してくれます。

2個目以上はヘッダを抹消したいのですが、その処理はListクラスのRemoveAtを使うのが一番簡単なので、ファイルを読み込む際はListクラスに変換しています。

文字列の配列にはLinqが使えるので、ToList()メソッドを呼ぶことでListクラスに変換することが出来ます。

Linqについては こちら の記事をご覧ください。

まとめ

いいかがでしたでしょうか。

CSV結合ツールの全ソースと主要部分の解説を行いました。

CSVを分割するよりも結合する方が簡単ですね。

あとは好みに合わせてレイアウトを変更したり、機能追加にチャレンジしてみて下さい。

次回は、「結合実行ボタンクリック処理」を別のアルゴリズムで置き換えてみたいと思います。

タイトルとURLをコピーしました