[C#] カンマ(,)を値に持つCSVファイルの読み込み(TextFieldParser)

Pocket

ここでは、csvファイルの各値がダブルコーテーション(”)で囲まれたデータの読み込みを行うサンプルコードを掲載しています。

最近、ダムとか滝の投稿ばかりでした。自分はプログラマーであることを忘れていました(笑)。

スポンサーリンク

csvファイルの読み込み

CSVファイル内で値としてカンマを使用する場合には、各値をダブルコーテーションで囲む必要がありますが、次のような処理では機能不足となります。

ダブルコーテーションで囲まれている場合には、除去するといった処理が必要です。また、その他エスケープ処理などのcsvの基本的な実装も独自で行うことも大変です。

string csvFilePath = @"g:\test.csv";

using (StreamReader sr = new StreamReader(csvFilePath, 
                                          Encoding.GetEncoding("Shift_JIS")))
{
    // ヘッダを読み飛ばす(この処理は必要に応じて)
    var line = sr.ReadLine();

    while (!sr.EndOfStream)
    {
        // ファイルから一行読み込む
        line = sr.ReadLine();
        // 読み込んだ一行をカンマ毎に分けて配列に格納する
        var cols = line.Split(',');

        // この位置で必要な処理を行う
    }
}

実際には、上記のような処理でも問題とならないことも多いと思います

 

TextFieldParserクラスを使う

Microsoft.VisualBasicの「参照の追加」が必要になりますが、TextFieldParserクラスを使用してcsvファイルを読み込むことができます。

この方法だと、ダブルコーテーションの除去やエスケープといった処理もクラス内でやってくれるので、ビジネスロジックの実装に注力できます。

//using Microsoft.VisualBasic.FileIO;

using (TextFieldParser tfp = new TextFieldParser(csvFilePath, 
                                                 Encoding.GetEncoding("Shift_JIS")))
{
    //値がカンマで区切られているとする
    tfp.TextFieldType = FieldType.Delimited;
    tfp.Delimiters = new string[] { "," };

    //値がダブルコーテーションで囲まれているか
    tfp.HasFieldsEnclosedInQuotes = true;

    //値をトリミングするか否か(お好みで)
    tfp.TrimWhiteSpace = false;

    // ヘッダを読み飛ばす(必要に応じて)
    string[] csvHeader = tfp.ReadFields();

    while (!tfp.EndOfData)
    {
        // 1行読み込む
        string[] cols = tfp.ReadFields();

        // この位置で必要な処理をする
    }
}

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *