トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

11-11 CSVの読み込み

問題

ある関数(splitCSV)に渡された文字列を配列に分解して列ごとに表示してください。
渡される文字列は、CSVデータの1レコードが設定されているとします。

使用するデータはK3形式が元になっている仕様で
エクセルが出力しているような形式です。

書式には次のような特徴があります。
1. 各レコードは「改行」によって区切られている。
2. 各列は「,」によって区切られている。
3. 列のデータは「"」によって囲んでも良い。
4. 列に「,」「改行」「"」いずれかを含む場合「"」で
   囲わなければならない。
5. 列データに「"」を含める場合「""」とする。

本来、改行コードはCRLFですが今回は特に指定しません。

次の入力があった場合
"aaa","b
bb","ccc",zzz,"y""Y""y",xxx

出力は
1 => aaa
2 => b
bb
3 => ccc
4 => zzz
5 => y"Y"y
6 => xxx

となります。

Test.csvの中身
AAA,BBB,CCC,ZZZ,yYy,XXX
"aaa","b
bb","ccc",zzz,"y""Y""y",xxx
111,222,333,444,555,666


ソース

using System;
using Microsoft.VisualBasic.FileIO;

class Program
{
    static void Main()
    {
        string CSVPath = @"D:\CSharp\TextFieldParser\Test.csv";
        var parser = new TextFieldParser(CSVPath);
        parser.SetDelimiters(",");

        while (!parser.EndOfData) {
            int I = 0;
            foreach (string each in parser.ReadFields()) {
                Console.WriteLine("{0} => {1}", I++, each);
            }
        }
    }
}


実行結果

0 => AAA
1 => BBB
2 => CCC
3 => ZZZ
4 => yYy
5 => XXX
0 => aaa
1 => b
bb
2 => ccc
3 => zzz
4 => y"Y"y
5 => xxx
0 => 111
1 => 222
2 => 333
3 => 444
4 => 555
5 => 666


解説

2-4 TextFieldParserクラスを使うと便利です。