トップC#入門 > CSVファイルの読み込み

CSVファイルの読み込み

1.シンプルなCSVファイル

最もシンプルなCSVファイルの例を下に示す。 アイテムはカンマ「,」で区切られており、アイテムの文字列には「,」を含まない。

経済圏,JP:日本,US:米国,XM:ユーロ圏
Nov-12,99.36,98.39,93.87
Dec-12,95.35,97.24,95.87
Jan-13,89.31,98.07,96.91
Feb-13,85.19,99.5,98.4
Mar-13,84.58,100.69,97.83
Apr-13,81.76,100.57,97.94

この場合には、次のような簡単なプログラムで、CSVファイルを読み込み、アイテムに分割することができる。

using System;
using System.IO;
using System.Text;

class HelloWorld {
    static void Main() {
	string filePath = @"c:\mh\www\csharp\sample01.csv";
        StreamReader reader = new StreamReader(filePath, Encoding.GetEncoding("Shift_JIS"));
        while (reader.Peek() >= 0) {
	    string[] cols = reader.ReadLine().Split(',');
	    for (int n = 0; n < cols.Length; n++)
        	Console.Write(cols[n] + "\t");
	    Console.WriteLine("");
	}
	reader.Close();
    }
}

実行結果を下に示す。

次に示すように、csvファイルを一括して読み込む方法もある。 ファイルIO処理がシンプルになる。

巨大なcsvファイルではメモリが負担になるかも知れないが、 そもそもひとつの csvファイルを巨大にするのは信頼性上問題となる。 適宜分割したり、あるいは、csvファイルではなく、何らかのデータベースファイルとすべきであろう。

using System;
using System.IO;
using System.Text;

class LoadCsv {
    static void Main() {
        string filePath = @"c:\mh\www\csharp\sample01.csv";
        string text = File.ReadAllText(filePath, Encoding.GetEncoding("Shift_JIS"));
        string[] rows = text.Trim().Replace("\r","").Split('\n');
        foreach (string row in rows) {
            string[] cols = row.Split(',');
            for (int n = 0; n < cols.Length; n++)
                Console.Write(cols[n] + "\t");
            Console.WriteLine("");
        }
    }
}

行単位で読み込んだデータを配列とするには、Listクラスを使う。下に例を示す。

    string[][] loadCSV(string filePath) {
        var list = new List<string[]>();
        StreamReader reader = 
	    new StreamReader(filePath, System.Text.Encoding.GetEncoding("Shift_JIS"));
        while (reader.Peek() >= 0) list.Add(reader.ReadLine().Split(','));
        reader.Close();
        return list.ToArray();
    }

2.アイテム文字列にカンマ「,」を含む場合

ひとつのアイテムが 「123,456.78」 とか 「a, b, or c」のように、 カンマ「,」を含む場合、"123,456.78"、"a, b, or c" のように、アイテムの文字列を二重引用符「"」で括る。 このような場合、前節のプログラムは使えない。

また、アイテムを二重引用符「"」で括る場合、アイテム中に二重引用符「"」を含む場合、 二重引用符「"」を重ねるのが規格である。従って「JP:"日本"」は「"JP:""日本"""」と表される。

経済圏,"JP:""日本""",US:"米国",XM:"ユーロ圏"
12-Nov,"12,345.67","98.39, 123.45",93.87
12-Dec,95.35,97.24,95.87
13-Jan,89.31,"1,398.07",96.91

上述のようなCSVファイルはTextFieldParserクラスを使えば、CSV規格に従って読み込むことができる。 プログラムを下に示す。TextFieldParserクラスの名前空間は Microsoft.VisualBasic.FileIOであり、デフォルトのdllにはなく、 microsoft.visualbasic.dll に含まれるため、コマンドライン・コンパイルの場合、 /r: オプションでこのdllのフルパスを指定する必要がある。

using System;
using System.Text;
using Microsoft.VisualBasic.FileIO;

class HelloWorld {
    static void Main() {
	string csvfile = @"c:\mh\www\csharp\sample02.csv";
        TextFieldParser parser = new TextFieldParser(csvfile, Encoding.GetEncoding("Shift_JIS"));
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(","); // 区切り文字はコンマ
        while (!parser.EndOfData) {
            string[] cols = parser.ReadFields(); // 1行読み込み
	    for (int n = 0; n < cols.Length; n++)
        	Console.Write("|" + cols[n]);
	    Console.WriteLine("|");
        }
    }
}

実行結果を下に示す。