いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

CSVファイルの読み出し(TextFieldParser)(Microsoft.VisualBasic.FileIO)

元ネタは、ここから。
ダブルクオーテーション付のCVSファイルをC#で読み込む方法(From とりカシュの8bit級ブログさん)

知らなかったです。こんなクラスがあるとは・・・。
しかも、.NET 2.0から追加みたいですね。


自前で、ファイルオープンして一行読み込んでsplitして処理するより
こちらの方が簡単です。クォートの処理もうまくしてくれそうな雰囲気です。
(試してないですが・・)


とりカシュさんの方でもとても分かり易いサンプルがありますが、
一応、勉強のためにこちらも作成しました。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.IO;

using Microsoft.VisualBasic.FileIO;

namespace Gsf.Samples.CSharp{

    public class TextFieldParserSample : IExecutable{

        /// 
        /// 処理を実行します。
        /// 
        public void Execute(){

            string tmpFileName = null;
            try{

                tmpFileName = Path.GetTempFileName();

                //
                // CSVファイルの作成.
                //
                using(StreamWriter writer = new StreamWriter(tmpFileName)){
                    for(int i = 0; i < 10; i++){
                        int j = i;

                        writer.WriteLine(string.Format("{0},{1},{2},{3}", j, ++j, ++j, ++j));
                    }
                }

                //
                // TextFieldParserを用いて読み出し.
                //
                using(TextFieldParser parser = new TextFieldParser(tmpFileName)){
                    // 区切り文字があることを伝える
                    parser.TextFieldType = FieldType.Delimited;
                    // 区切り文字を設定
                    parser.SetDelimiters(",");

                    //
                    // データを取得.
                    //
                    for(; !parser.EndOfData; ){
                        Console.WriteLine("{0}: [{1}]", parser.LineNumber.ToString().PadLeft(2, '0'), string.Join(" ", parser.ReadFields()));
                    }
                }

            }finally{
                if(!string.IsNullOrEmpty(tmpFileName)){
                    File.Delete(tmpFileName);
                }
            }
        }
    }
}

[追記]
TextFieldParserクラスを利用するには

の参照が必要です。