システム開発・Webサイト構築 プラスラス

2008/2/26 火曜日

【.NET】カンマ区切り(CSV)のファイルを処理する

このエントリーを含むはてなブックマーク Yahoo!ブックマークに登録 Google ブックマーク del.icio.us

VB.NETやC#で、文字列を特定のデリミタ区切り文字)でフィールドを分けられたCSVファイル固定長形式のテキストファイルを処理する方法です。

カンマ区切り(CSV)のファイルを処理する

XMLファイルで扱うデータが増えてきたとは言え、まだまだCSVファイルも使われています。

まずは、エスケープシーケンスなどを考慮せずに済むような単純なケースです。

文字列をカンマなどで単純に分割する

通常、単純に特定の文字で分割するには、.NETではSystem.String.Split()メソッドを使います。

結果は、System.Stringの配列で返ります。

単純なカンマ区切りの文字列を分割するサンプルです。

'VB.NETのサンプル

'分割対象の文字列
Dim targetString As String = "AAAA,BBB,CCC"

'区切り文字はカンマ
Dim delimiter As Char = ","c

'分割した結果を文字列の配列で受け取る
Dim splittedResult As String() = targetString.Split(delimiter)

'受け取った配列の要素を出力
For Each output As String In splittedResult
    Console.WriteLine(output)
Next
//C#のサンプル

//分割対象の文字列
string targetString = "AAAA,BBB,CCC";

//区切り文字はカンマ
char delimiter = ',';

//分割した結果を文字列の配列で受け取る
string[] splittedResult = targetString.Split(delimiter);

//受け取った配列の要素を出力
foreach (string output in splittedResult)
{
    Console.WriteLine(output);
}

ただし、この方法では、ダブルクォーテーションで括られたカンマや改行はフィールド内の値とみなすなどのCSVの仕様を満たした扱いはできません。

CSVファイルの仕様に基づいた処理

.NET Framework 2.0(Visual Studio 2005)からはCSVの仕様に基づいた解釈をさせることができます。

(1.0や1.1では、自分で実装しなくてはなりません。)

CSVを読み込んで処理するには、Microsoft.VisualBasic.FileIO.TextFieldParserクラスを使用します。

Microsoft.VisualBasic.FileIOネームスペース下のクラスを使用するので、参照設定が必要です。

C#の場合は自分で参照を追加してください。(VB.NETの場合は、既定で参照されるので必要ありません。)

Visual Studio 2005では、メニューバーの【プロジェクト】→【参照の追加】で【.NET】タブにある、Micorosoft.VisualBasicを追加します。

参照の追加

以下は、CSVファイルを読み込むサンプルです。

'VB.NETのサンプル
'ファイル名と文字エンコードを指定してパーサを実体化
Dim txtParser As Microsoft.VisualBasic.FileIO.TextFieldParser = _
    New Microsoft.VisualBasic.FileIO.TextFieldParser( _
                 "ファイル名.csv", _
                System.Text.Encoding.GetEncoding("shift_jis"))

'内容は区切り文字形式
txtParser.TextFieldType = _
    Microsoft.VisualBasic.FileIO.FieldType.Delimited

'デリミタはカンマ
txtParser.SetDelimiters(",")

'ファイルの終わりまで一行ずつ処理
While Not txtParser.EndOfData

    '一行を読み込んで配列に結果を受け取る
    Dim splittedResult As String() = txtParser.ReadFields()

    '出力してみる
    For Each output As String In splittedResult
        Console.WriteLine(output)
    Next

    Console.WriteLine("行の終わり")

End While

'最後に閉じる
txtParser.Close()
//C#のサンプル

//ファイル名と文字エンコードを指定してパーサを実体化
Microsoft.VisualBasic.FileIO.TextFieldParser txtParser =
    new Microsoft.VisualBasic.FileIO.TextFieldParser(
            "ファイル名.csv",
            System.Text.Encoding.GetEncoding("shift_jis"));

//内容は区切り文字形式
txtParser.TextFieldType = _
        Microsoft.VisualBasic.FileIO.FieldType.Delimited;
//デリミタはカンマ
txtParser.SetDelimiters(",");

//ファイルの終わりまで一行ずつ処理
while (!txtParser.EndOfData)
{
    //一行を読み込んで配列に結果を受け取る
    string[] splittedResult = txtParser.ReadFields();

    //出力してみる
    foreach (string output in splittedResult)
    {
        Console.WriteLine(output);
    }

    Console.WriteLine("行の終わり");
}

//最後に閉じる
txtParser.Close();

固定長ファイルの読み込み

TextFieldParserは、固定長形式のファイルを処理する場合にも同じように使用できます。

固定長ファイルの場合は、TextFieldParser.TextFieldType プロパティに FieldType.FixedWidth を指定し、FieldWidths プロパティに項目長を整数の配列で指定します。

Filed under: C#,Programming,VB.NET — Nakai @ 0:05:12

1件のコメント »

  1. 大変参考になりました。(見やすいです)

    固定長の漢字が混じったテキストファイルを取り込む場合の方法(バイト数で区切る)が知りたいです。よろしくお願いいたします。

    コメント by まっく — 2009/10/14 水曜日 @ 12:04:45

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.947 sec. Powered by WordPress