|
.NET TIPS CSVファイルを読み込むには?[2.0のみ、C#、VB]デジタルアドバンテージ 遠藤 孝信2006/08/18 |
![]() |
|
|
|
CSVファイル(コンマ区切りのファイル)を読み込む処理は、フィールド自体にコンマが含まれていたり、フィールドがダブルクオーテーションで囲まれていたりする場合などがあり、結構面倒な作業である*。
| * CSVファイルの仕様については以前は明確なものがなかったが、現在ではRFC4180により標準化されている。 |
しかし.NET Framework 2.0には、主にVB 2005用の機能として、CSVファイルを読み込み、解析を行ってくれる非常に便利なTextFieldParserクラス(Microsoft.VisualBasic.FileIO名前空間)が追加されている。このクラスを使えば、CSVを読み込んで各行の各フィールドの文字列を簡単に取り出すことができる。
もちろんこのTextFieldParserクラスはC#からも利用可能だ。本稿ではこのクラスを使ってCSVファイルを読み込むための方法について解説する。
TextFieldParserクラスによるCSVファイルの読み込み
TextFieldParserクラスを使用してCSVファイルを読み込むには、まず処理したいCSVファイルをコンストラクタで指定してインスタンスを作成する。
CSVファイルに日本語が含まれている場合には、ここでエンコーディングも指定可能だ(以降のコード例は上がC#、下がVBの場合)。
| ||
| TextFieldParserクラスのコンストラクタ呼び出し |
次にTextFieldTypeプロパティにFieldType.Delimitedを設定する(FieldType.FixedWidthを指定すればフィールドが固定幅のファイルも扱うことができる)。
また、SetDelimitersメソッドを呼び出して区切り文字を設定しておく(複数の区切り文字が指定可能)。CSVファイルの場合にはもちろんコンマを指定する。
| ||
| フィールドがコンマで区切られている場合の設定 |
あとはReadFieldsメソッドを呼び出すごとに、CSVファイルを1行ずつ読むことができる。このメソッドは、読み込んだ行の全フィールドを文字列の配列として返す。
読み込むべき行がまだ残っているかどうかはEndOfDataプロパティにより判定できるので、次のようなループによりCSVファイル全体を処理できる。
| ||
| CSVファイル全体を読み込みながら処理するループ |
CSVファイルを読み込み、表示するサンプル・プログラム
次に示すサンプル・プログラムは、CSVファイルであるtext.csvを読み込み、各フィールドを切り出してTAB区切りで画面に出力する。
なおこのプログラムでは、改行文字や空白文字がどのように処理されるかを分かりやすくするために、それぞれを「n」と「_」に置き換えて出力する。
| |
| CSVファイルを読み込み、表示するC#のサンプル・プログラム(csvparser.cs) | |
| |
| CSVファイルを読み込み、表示するVBのサンプル・プログラム(csvparser.vb) | |
このサンプル・プログラムに次のような内容のCSVファイルを読み込ませた場合の出力を以下に示す。
| |
| サンプル・プログラムに読み込ませるCSVファイル(test.csv)の内容 | |
| 最後の行は2番目のフィールドの途中に改行が入っている。 |
このCSVファイルを読み込ませた場合のプログラムの出力は次のようになる(実際には出力はTAB区切りとなるが、ここでは分かりやすいように表形式に整形している)。
| |||||||||||||||||||||
| サンプル・プログラムの出力結果 | |||||||||||||||||||||
ダブルクオーテーションで囲まれているフィールドや、改行文字が含まれているフィールドも正しく処理されているのが分かる。またデフォルトの設定では、フィールドの前後にある空白文字が自動的に削除されているのも分かる。
■HasFieldsEnclosedInQuotesプロパティ
すべてのフィールドが単純にコンマで区切られているものとして処理したい場合には、HasFieldsEnclosedInQuotesプロパティをfalseに設定する(デフォルトはtrue)。
以下の出力結果は、上記のサンプル・プログラムでこのプロパティをfalseに設定した場合のものである。
| ||||||||||||||||||||||||||||||||
| HasFieldsEnclosedInQuotes=falseの場合の出力結果 | ||||||||||||||||||||||||||||||||
この場合にはダブルクオーテーションは処理されないのでそのまま出力される。フィールドの途中に改行が入っているデータは2つの行として扱われることになる。
■TrimWhiteSpaceプロパティ
フィールド前後の空白文字を削除したくない場合にはTrimWhiteSpaceプロパティをfalseに設定する(デフォルトはtrue)。
上記のサンプル・プログラムでこのプロパティをfalseに設定した場合の出力結果を以下に示す(HasFieldsEnclosedInQuotesプロパティはtrueのまま)。
| |||||||||||||||||||||
| TrimWhiteSpace=falseの場合の出力結果 | |||||||||||||||||||||
ダブルクオーテーションで囲まれていないフィールドは、区切り文字であるコンマ以外の文字がすべて出力されている。また、ダブルクオーテーションで囲まれているフィールドは、ダブルクオーテーション内のフィールドの前後の空白文字が削除されない。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:クラス・ライブラリ 処理対象:テキスト・ファイル 使用ライブラリ:TextFieldParserクラス(Microsoft.VisualBasic.FileIO名前空間) 使用ライブラリ:FieldType列挙体(Microsoft.VisualBasic.FileIO名前空間) |
| 「.NET TIPS」 |
TechTargetジャパン
- 複雑なデータをバインドするには? (2013/5/23)
複雑なデータ・クラスをコントロールにバインドする方法を解説。また、バインドしたコレクションの変更を反映させる方法も説明する - データ・コレクションをバインドするには? (2013/5/16)
Windowsストア・アプリやWindows Phone 8アプリで、データのコレクションをコントロールにバインドする方法を解説する - コントロール同士をデータ・バインドするには? (2013/5/9)
データ・バインドの仕組みを使うと、データ・クラスだけでなく、コントロール同士もバインドできる。その方法を説明する - 自動ビルドを実現するビルド・サービス環境の構築 (2013/5/8)
ソース・コードの管理環境の構築の次は、自動ビルド環境を構成しよう。Team Foundation Server Expressの機能を活用して簡単に構築
|
|
- TwilioとRailsで作る、電話でテキスト読み上げアプリ
- Java SE 8、Java EE 7、Java Embeddedはどうなる?
- 「Scalr」を使ったAWS管理を試す
- Google I/OでモバイルアプリUXの条件を考えた
- 秀丸スタートメニューで[スタート]ボタンを追加する
- Chrome拡張機能にpush通知をしよう
- データ分析に必要な「道具」を揃える
- 複雑なデータをバインドするには?
- LLMNRを使ったローカル・セグメント上での名前解決
- 「演算子のインジェクション」と「SSJI」
- DNSを使ってネットワークデバイスにホスト名で接続
- 「ポジションが上がる=マネージャ業務」ではない
キャリアアップ
- - PR -
イベントカレンダー
- - PR -
転職/派遣情報を探す
**先週の人気講座ランキング**
〜 Android編 〜
ホワイトペーパー(TechTargetジャパン)
「ITmedia マーケティング」新着記事
スマホ vs. タブレット、ユーザーの行動特性から考えるマーケティング戦略
これまで「PC対モバイルデバイス(スマートフォン/タブレット)」という図式で語られる...
リアルワールド、34万人のクラウドソーシングによるソーシャルリスニングサービスを開始
リアルワールドは5月23日、同社が提供する国内最大級のクラウドソーシングサービス「CROW...
Googleアナリティクスでテラバイト級のビッグデータ解析機能を提供――プレミアムユーザー限定
Google BigQueryは、2010年のGoogle I/Oで発表された、大量データセットの解析を実現する...


