以前作成したCSV分割ツールはCSVの解析に TextFieldParser を使用していました。TextFieldParser はフィールドに含まれる改行のみの行を無視してくれるといういけずな仕様だったのでCSVパーサーを自作して本問題を解決しています。

以前のツールの旧CSV分割ツールのページからの引用

巨大なファイルを分割する機会がありましたので,CSV 分割ツールを作ってみました。ちまたにいっぱいあるのですが、今回は要件が面倒で、外部ファイルに定義されているヘッダを分割しがら差し込む必要があるので、その機能が実装されています。この機能が必要な要件に今後出くわすかが不明ですが。

1.CSV分割ツール

リとソースのリンクを掲載します。4.1.0.0 は .NET 4.0 用の Visual Studio 2010 ソリューションとビルド済みのexeです。一通り動作確認していますが、まだベータ版です。

.NET 3.0,.NET3.5 用のソリューションはありません(ソースから作成することは難しくないと思います)。

  ソース バイナリのみ
バージョン4.0 CsvDivNet_src_4.1.0.0.zip CsvDivNet_bin_4.1.0.0.bin

最新のソースコードとバイナリは GitHubのページを参照してください。

2. 機能

次の機能が実装されています。

  • GUI を使用したCSVファイル分割処理
  • GUIを使用しないコマンドラインからCSVファイル分割処理
  • CSVとしての行数指定分割。データに改行が含まれていても""で囲まれていればデータ項目として判定します。
  • 外部ファイルからヘッダの差し込み。分割ファイルごとに先頭に外部ヘッダファイルレコードを差し込みます。
  • 各分割ファイルの先頭にヘッダを差し込む。外部ファイルに定義されたヘッダもしくは、オリジナルファイルの1行目をヘッダとして差し込むように設定できます。ヘッダを差し込まないようにすることもできます。
  • ファイルの文字コードにShift-JIS, UTF-8, Unicode, Euc-JP をサポート
  • 出力ファイル名形式を選択可能。

 コマンドラインモードはバッチ処理などで便利ではないかとおもい実装しました。

3. 使い方

GUIモードでの使い方を主に解説します。コマンドラインモードもGUIと同じ機能をオプションで指定できます。コマンドラインモードで指定するオプションは コマンドプロンプトから /help オプションを指定してexeを起動して確認できます。

3.1 GUIモード

さっそく GUIでの使い方を記載します。まず、exe をダブルクリックしてGUIモードで起動できます。次のような画面が表示されます。各項目の説明を以下の表に記載します。

 各項目の説明

項目 説明
分割ファイル 分割対象ファイルを指定します。右端のボタンをクリックしてファイル選択ダイアログを使用してファイルを選択できます。
ドラッグアンドドロップでファイルを指定できます。
文字コード - 入力ファイル 入力ファイルの文字コードを指定します。Shift-JIS, UTF-8,Unicode, ASCII, EUC-JP から選択できます。
データ区切文字 データ項目の区切り文字(セパレータ)を指定します。 カンマ( , ) か タブ (\t) を指定できます。
" で囲まれている データ項目がダブルクォーテーション( " ) で囲まれているかを指定します。この設定は出力ファイルのデータ項目にも引き継がれます。
ヘッダオプション

ヘッダの差し込みオプションを指定します。オプションには入力ファイルの一行目,ヘッダは存在しない,外部ファイルからの差込を選択できます。

入力ファイルの一行目を選択すると分割対象ファイルの1行目をヘッダとみなして各分割ファイルにヘッダを差し込みます。

ヘッダは存在しないの場合は差し込みを行いません。

外部ファイルからの差込の場合は外部ヘッダファイルで指定されたファイルのデータを各分割ファイルの先頭に差込ます。

外部ヘッダファイル ヘッダオプションが外部ファイルからの差込の場合に、ヘッダファイルを指定します。
ドラッグアンドドロップでファイルを指定できます。
出力先ディレクトリ 分割ファイルを出力するフォルダを指定します。右端のボタンをクリックするとフォルダ選択ダイアログが表示され、ダイアログからフォルダを選択できます。
フォルダをドラッグアンドドロップで設定できます。
"分割対象ファイルと同じディレクトリに出力" を選択すると、出力先ディレクトリの指定は無視され、入力ファイルと同じディレクトリに分割ファイルを出力します。
出力ファイルベース名 出力ファイルのベース名を指定します。ベース名に各ファイルの枝番とファイル拡張子を結合した文字列がファイル名になります。
ファイル拡張子 分割ファイルの拡張子を指定します。
文字コード - 出力ファイル 出力ファイルの文字コードを指定します。Shift-JIS, UTF-8,Unicode, ASCII, EUC-JP から選択できます。
分割行数単位 分割するレコード単位を指定します。CSVとしてのレコード数です。データに改行が含まれていても1行とみなされます。
ファイル枝番桁数 分割するファイルの枝番の桁数を指定します。 3の場合 001, 002 のように枝番がファイル名に設定されます。
ファイル名例 出力されるファイルのサンプル名が表示されます。
分割ログ 処理のログが出力されます。
分割 ボタン 設定に従って分割処理を実施します。分割処理が成功するとexeと同じパスにconfig.xmlというファイルが作成または更新されます。これは最新のGUIの設定を記録したファイルであり、コマンドラインモードで使用することができます。詳細はコマンドラインモードの説明を参照。
閉じる ボタン 画面を閉じます。

 

3.2 コマンドラインモード

GUIと同じ操作をコマンドラインから実現できます。簡単な使い方を説明します。

ヘルプを表示する場合は次のようにコマンドを入力します。

CsvDivNet.exe /console /help

各項目について詳細なオプションを指定して分割を行えますが骨の折れる作業です。そこで、GUIで分割が成功した時にexeのフォルダに作成されるconfig.xml をベースとして動的に変化のある項目のみをコマンドラインオプションで指定する方法を推奨します。

GUI画面で成功した設定と同じ内容で 分割する場合は次のコマンドを使用します。

CsvDivNet.exe /console /config:.\config.xml

入力ファイルのみをconfig.xml の内容から上書きして分割処理を行う場合は次のようにコマンドを使用します。

CsvDivNet.exe /console /config:.\config.xml /inputfile:C:\work\hugedata.csv

コマンドラインオプションは細かく各オプションを設定するのではなく、GUIで作成したconfig ファイルをベースとして変更箇所のみをオプションで指定して分割を行う運用を想定しています。

4. リリース履歴

  • 2013/02/02 ベータ版公開