2009年11月08日

【yield】 CSVファイルを縦列毎に列挙する

今回は、yield returnの実践例を紹介します。
CSVファイルを行毎に列挙するサンプルコードは、@ITのこちらで公開されていますが、
これを少し改造してCSVファイルを縦列毎に列挙するサンプルコードを作成しました。

以下にサンプルで使用したCSVファイルの内容を示します。
gamehard.csv」の内容


続いて、実際のコードです。
class CsvParser
{
    // CSVファイルのパス
    private string filePath;

    // コンストラクタ
    public CsvParser(string path)
    {
        filePath = path;
    }

    // foreach可能なメソッド
    public IEnumerable<string> GetColumns(int idx)
    {
        // CSV Parserを使用( TextFieldParserは「using Microsoft.VisualBasic.FileIO」と参照設定が必要 )
        using (var parser = new TextFieldParser(filePath, Encoding.GetEncoding("Shift_JIS")))
        {
            parser.TextFieldType = FieldType.Delimited;
            parser.SetDelimiters(","); // 区切り文字はコンマ=CSV形式

            while (!parser.EndOfData)
            {
                // 1行読み込み
                string[] row = parser.ReadFields();
                // N列目のカラムを返す
                yield return row[idx];
            }
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // CSVファイルのカラム数分ループしている(すべての列を順に列挙)
        for (int i = 0; i < 5; i++)
        {
            // CSVファイル名を指定
            var csv = new CsvParser("gamehard.csv");

            // CSVファイルの特定の縦列を列挙する
            foreach (string col in csv.GetColumns(i))
            {
                Console.WriteLine(col);
            }
        }
    }
}
//<出力結果>
//1
//2
//3
//4
//5
//ファミリーコンピュータ
//スーパーファミコン
//セガサターン
//プレイステーション
//Xbox
//1983年7月15日
//1990年11月21日
//1994年11月22日
//1994年12月3日
//2002年2月22日
//任天堂
//任天堂
//セガ・エンタープライゼス
//ソニー・コンピュータエンタテインメント
//マイクロソフト
//14800円
//25000円
//44800円
//39800円
//34800円
ループでCSVファイルの1〜5列目を順番に出力しています。
foreach文に指定しているGetColumnsメソッドの引数で、何列目を列挙するかを指定出来るようにしています。
yield returnを使用することで、簡単な構文でforeachを可能にしています。
CSVの列を縦に列挙する事があるかは疑問ですが、yieldの使い方を覚えておけばいざという時に役に立つかもしれません。

タグ:yield
posted by 吾一 at 00:06| 4. yield return | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。