2010-02-12

C#でExcel CSVの読み込む

特にExcelで作成したCSVファイルを読み込む場合、フィールド自体にコンマや改行が含まれていたり、フィールドがダブルクオーテーションで囲まれていたり、いなかったりなど、結構面倒な処理が必要であった。

C++6.0 と違い .NET(2.0以上)は簡単にCSV形式を扱うことが可能となっている。

実際にはTextFieldParserクラスを使用して読み込みを行えば良い。

まずは、参照に、Microsoft.VisualBasic.dll を追加する。

その後に.csファイルに下記を記載すればOK。ホント簡単である。
■インポート
using Microsoft.VisualBasic.FileIO;

■実装
TextFieldParser parser = new TextFieldParser("filename.csv",
            System.Text.Encoding.GetEncoding("Shift_JIS"));

using (parser) {
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");     // デリミタ指定

    // parser.HasFieldsEnclosedInQuotes = false;
    // parser.TrimWhiteSpace = false;

    while (!parser.EndOfData) {
        string[] row = parser.ReadFields();
        foreach (string field in row) {
            // 各処理
        }
    }
}

なお、下記はお好みに応じて指定。
「"」処理をしない場合はfalseを(デフォルトtrue)。
単純にデリミタ区切りでそのまま出力されるため、""内の','もデリミタと判定される。
parser.HasFieldsEnclosedInQuotes = false;

フィールド前後の空白文字を削除しない場合はfalseを(デフォルトtrue)。
parser.TrimWhiteSpace = false;

※なお、フィールド内の改行は0x0Aなので、SQLServer等、DB登録する際には注意(0x0D0Aに変換する必要有り)。


■Excel CSV 書き出し
また、逆に書き出す時はどうするか...
自分はこんな関数を作って1行文字列を生成してWriteLine()で書き出している。

string getWriteLine(string[] fields) {
    string s = string.Empty;
    for (int i = 0; i < fields.Length; i++) {
        string field = fields[i];
        //"で囲む必要があるか?
        if (field.IndexOf('"') > -1 ||
            field.IndexOf(',') > -1 ||
            field.IndexOf('\r') > -1 ||
            field.IndexOf('\n') > -1 ||
            field.StartsWith(" ") || field.StartsWith("\t") ||
            field.EndsWith(" ") || field.EndsWith("\t")) {
            if (field.IndexOf('"') > -1) {
                //"を""とする
                field = field.Replace("\"", "\"\"");
            }
            field = "\"" + field + "\"";
        }
        s += field;
       
        if (fields.Length -1 > i) {
                s += ',';
        }
    }
    return s;
}

0 コメント:

コメントを投稿

 
Copyright 2010 toconuts. Powered by Blogger Blogger Templates create by Deluxe Templates. WP by Masterplan