Created on 26.Jun 2013
Modified on 11.Jan 2015
汎用CSV読込フォーム CsvReader.NETについて
動作イメージ

はじめに

業務PGをしたことのある人間であれば必ずCSVの読込処理をかじったことがあるんじゃないか、と思われるほど
基本的な要件であるにもかかわらず、.NET環境で使える汎用的なCSV読込モジュールを見たことがないという人は多いと思います。
実に不思議で仕方がありませんが、それとも私の探し方が悪かったのでしょうか。
まあ、そんなこんな思案したところ、同じような処理を何度も書くのは時間と資源の無駄でしかないので、
なるたけ汎用的に使えるCSV読込モジュールを製作することにしました。
自分で言うのもなんですが結構出来が良かったのと、研究発表というかデモンストレーションというか、
まあそういう感じのノリで公開することにいたしました。
なお、あくまでも個人作成でしかなく正常系でしかテストしていないので、なにか不具合があるかもしれませんが、
便利だと思ったら使ってやってください。

            

特長

下記のような特長がアリマス。
  1. ファイルの定義は定義ファイルを使用することで対応できる
  2. CSVファイルやTSVファイルになどについて定義ファイルに指定した列名での読込が可能です。
    DLLファイルと同じ階層に定義XMLファイルを置く必要がありますが、一度置いてしまえば CSV定義が変わった場合でもXMLを差し替えることで対応可能です。
    そのためCSVの列名が変わったとかよくある変更ならば、いちいち実行ファイルをリビルドしなくても定義ファイルを書き換えれば対応できます。
    定義XMLファイル形式
  3. ファイルのチェックも同時に行うことができる
  4. 読込対象の列が存在することなどフォーマットチェックが可能です。
    列名の他に列の長さなどが指定できます。ただし申し訳ありませんがあまりテストしていません。
    チェック結果
  5. 読み込んだデータはデータテーブルに格納される
  6. 2次元リストであるCSVファイルを2次元表に格納するので、実に自然でナチュラルでネイチャー。
    つまりCSVデータのチェックや利用についてはデータテーブルを利用することになります。
  7. 必要な列だけ定義すればいい
  8. 社内システムによってはちょっとした指定の違いで不必要な列まで含めて出力される場合があります。
    そうなるとパースが大変なので、読込に必要な列だけ定義することで、そういった形式の揺れによる不具合を回避できます。
    またユーザー自身により定義ファイル上からフラグによる制御も可能です。
  9. 列の格納順は気にしなくていい
  10. 定義は列名で行うので[hoge1,hoge2,hoge3]というファイルが[hoge2,hoge3,hoge1]となっても問題ない(と思います)。
  11. 見出し行と読込開始行を指定できる
  12. たまにある見出し行とデータの開始行が連続していないCSVファイルにも対応できます。
    特殊なCSVの例
    上図のアレな例のCSVについては見出し行1、データ開始行6を指定すれば対応できます。
    また利用時に初期化パラメータの見出し行を0行目とすることで、見出しがないCSVファイルを読み込むことが可能です。
  13. 見出し行がないファイルでも対応可能
  14. 見出し行がないファイルでもパラメータの見出し開始行を0にすれば普通に読めます。
    見出し行を指定しなかった場合
    ただし列名チェックが出来ないので列名は定義XMLの順番そのままの決め打ちとなります。
  15. 任意のデリミタを指定可能
  16. デリミタはカンマのみならずタブ文字や空白や任意の文字列を使用することが出来ます。
    ただし改行文字など特殊な文字は指定できません。
    またデリミタに空文字を指定した場合は列名は定義ファイルの列名を全てカンマで連結したものと見なされます。

  • その他、補足
  • 未確認機能…一例を挙げると読込キャンセル(2000レコード程度のファイルじゃ完了までが早すぎて押せない)とか、
    列ごとに最大文字数の定義(使いどころがなかった)とか、テストどころか動作すらさせていない機能とかあったりします。
    キャンセルボタン

ダウンロード


ファイル

まずはDLLをダウンロードして動作を確認してみてください。
CSV読込フォーム

CsvReader.NET ダウンロード(要 .NET FrameWork 2.0以降)
無保証ですのでご注意ください。
DLL単体の利用、配布等はご自由にどうぞ。

利用方法(例:VB.NET)

ソースファイル中のDLL利用部分サンプルを抜き出して改変しただけなので、
不明な場合はソースファイルをDLしてサンプルの内容を確認してください。
       'CSVを読み込んでデータテーブルに格納する
        If filePath.Length > 0 Then
            

            ' CSVを読み込みメモリ(データテーブル)に格納する
            Dim dlgResult As DialogResult           'フォームの戻り値
            Dim msg As String = ""                  'フォームのメッセージ
            Dim dt As New DataTable                 'CSVから読み込んだデータ
            Dim xmlFileName As String = "CsvCommon.xml" '設定XMLファイル名
            Dim delim As String = ""                    '区切り文字(空文字の場合は区切らず読み込む)
            Dim isRemoveQuote = False                   '行頭のシングルクォートを削除するか
            Dim captionRow = 0                          'CSVの見出し行番号
            Dim dataRow = 1                             'CSVのデータ行番号

            ' ファイル処理を開始
            Using fcr As New CsvReaderNet.CsvReaderNet(filePath, xmlFileName, delim, isRemoveQuote)
                ' プロパティ設定
                fcr.CaptionRowNumber = captionRow       '見出し行の位置
                fcr.DataRowNumber = dataRow             'データ行の位置
                ' フォーム表示
                dlgResult = fcr.ShowDialog(Me)          '汎用CSV読込フォームを表示
                msg = fcr.Message                       '汎用CSV読込フォームからのメッセージを取得
                If fcr.IsGettable Then                  'CSV読込済みならデータテーブルに格納
                    dt = fcr.GetDataTable
                End If
            End Using
            
            If Not IsNothing(dt) Then
                MessageBox.Show(dt.Count & "件を読み込みました")
            End If
        End If
                  

ソースファイル(VB.NET)

上記DLLに興味を持たれましたら、ソースファイルをダウンロードしてビルドしてみてください。
OOPの威力を実感していただけると思います。
VisualStudio2013にてサンプルプロジェクトごとテンプレートファイルにしています。
なおVisualStudio2005などの古いエディションでも、ソースファイル単位でコピペするなど工夫すれば使えると思います。
ソースファイルダウンロード

無保証ですのでご注意ください。
利用、改変等はご自由にどうぞ。ただしソースファイルの転載と再配布については禁止いたします。
しかしながら改変したものを再配布したい場合に限っては、出所を明示していただければ許可とします。


サンプルの使い方

サンプルを動かしたい場合はCsvReaderSample.zipのみをインポートしてビルドしてください。
サンプル用CSVのDL先(総務省)
(真ん中辺の”全国(CSV:~”からダウンロードできます)
なおVista以降ではUACの問題により"Program Files"の直下では動作しないと思います。
サンプルの実行イメージ









. .