
#region Using
using System;
using System.Collections.Generic;
using System.Text;
#endregion

namespace Wankuma.IO
{
	/// <summary>
	/// CSVデータをEnumerable形式で取得します。
	/// </summary>
	public class CSVReaderEnumerable
		: CSVReader
	{
		#region  public int カラム数
		/// <summary>
		/// カラム数の内部変数
		/// </summary>
		private int カラム数_;
		/// <summary>
		/// 取得するカラム数を指定します。
		/// </summary>
		public int カラム数
		{
			get { return this.カラム数_; }
			private set { this.カラム数_ = value; }
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, System.IO.Stream stream) 　指定したストリーム用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したストリーム用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="stream">読み込まれるストリーム。</param>
		/// <exception cref="System.ArgumentNullException">stream が null です。</exception>
		/// <exception cref="System.ArgumentException">stream が読み取りをサポートしていません。</exception>
		public CSVReaderEnumerable(int カラム数, System.IO.Stream stream)
			: base(stream)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, System.IO.Stream stream, char 区切り文字)　指定したストリーム用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したストリーム用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="stream">読み込まれるストリーム。</param>
		/// <param name="区切り文字">カンマ以外の区切り文字を利用したい場合に使います。</param>
		/// <exception cref="System.ArgumentNullException">stream が null です。</exception>
		/// <exception cref="System.ArgumentException">stream が読み取りをサポートしていません。</exception>
		public CSVReaderEnumerable(int カラム数, System.IO.Stream stream, char 区切り文字)
			: base(stream, 区切り文字)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, System.IO.TextReader reader)　指定したリーダ用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したリーダ用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="reader">読み込みを行うリーダ</param>
		/// <exception cref="System.ArgumentNullException">stream が null です。</exception>
		/// <exception cref="System.ArgumentException">stream が読み取りをサポートしていません。</exception>
		public CSVReaderEnumerable(int カラム数, System.IO.TextReader reader)
			: base(reader)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, System.IO.TextReader reader, char 区切り文字)　指定したリーダ用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したリーダ用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="reader">読み込みを行うリーダ</param>
		/// <param name="区切り文字">カンマ以外の区切り文字を利用したい場合に使います。</param>
		/// <exception cref="System.ArgumentNullException">stream が null です。</exception>
		/// <exception cref="System.ArgumentException">stream が読み取りをサポートしていません。</exception>
		public CSVReaderEnumerable(int カラム数, System.IO.TextReader reader, char 区切り文字)
			: base(reader, 区切り文字)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, string path)　指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="path">読み込まれる完全なファイルパス。</param>
		/// <exception cref="System.IO.IOException">path に、ファイル名、ディレクトリ名、またはボリューム ラベルとしては不正または無効な構文が含まれています。</exception>
		/// <exception cref="System.ArgumentNullException">path が null です。</exception>
		/// <exception cref="System.ArgumentException">path が空の文字列 ("") です。</exception>
		/// <exception cref="System.IO.DirectoryNotFoundException">割り当てられていないドライブであるなど、指定されたパスが無効です。</exception>
		/// <exception cref="System.IO.FileNotFoundException">ファイルが見つかりません。</exception>
		public CSVReaderEnumerable(int カラム数, string path)
			: base(path)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, string path)　指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="path">読み込まれる完全なファイルパス。</param>
		/// <param name="区切り文字">カンマ以外の区切り文字を利用したい場合に使います。</param>
		/// <exception cref="System.IO.IOException">path に、ファイル名、ディレクトリ名、またはボリューム ラベルとしては不正または無効な構文が含まれています。</exception>
		/// <exception cref="System.ArgumentNullException">path が null です。</exception>
		/// <exception cref="System.ArgumentException">path が空の文字列 ("") です。</exception>
		/// <exception cref="System.IO.DirectoryNotFoundException">割り当てられていないドライブであるなど、指定されたパスが無効です。</exception>
		/// <exception cref="System.IO.FileNotFoundException">ファイルが見つかりません。</exception>
		public CSVReaderEnumerable(int カラム数, string path, char 区切り文字)
			: base(path, 区切り文字)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, string path, Encoding encoding)  指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="path">読み込まれる完全なファイルパス。</param>
		/// <param name="encoding">使用する文字エンコーディング。</param>
		/// <exception cref="System.IO.IOException">path に、ファイル名、ディレクトリ名、またはボリューム ラベルとしては不正または無効な構文が含まれています。</exception>
		/// <exception cref="System.ArgumentNullException">path が null です。</exception>
		/// <exception cref="System.ArgumentException">path が空の文字列 ("") です。</exception>
		/// <exception cref="System.IO.DirectoryNotFoundException">割り当てられていないドライブであるなど、指定されたパスが無効です。</exception>
		/// <exception cref="System.IO.FileNotFoundException">ファイルが見つかりません。</exception>
		public CSVReaderEnumerable(int カラム数, string path, Encoding encoding)
			: base(path, encoding)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public CSVReaderEnumerable(int カラム数, string path, Encoding encoding, char 区切り文字)  指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// <summary>
		/// 指定したファイル名用の System.IO.StreamReader を利用して新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="カラム数">指定カラム数必ず取得します。</param>
		/// <param name="path">読み込まれる完全なファイルパス。</param>
		/// <param name="encoding">使用する文字エンコーディング。</param>
		/// <param name="区切り文字">カンマ以外の区切り文字を利用したい場合に使います。</param>
		/// <exception cref="System.IO.IOException">path に、ファイル名、ディレクトリ名、またはボリューム ラベルとしては不正または無効な構文が含まれています。</exception>
		/// <exception cref="System.ArgumentNullException">path が null です。</exception>
		/// <exception cref="System.ArgumentException">path が空の文字列 ("") です。</exception>
		/// <exception cref="System.IO.DirectoryNotFoundException">割り当てられていないドライブであるなど、指定されたパスが無効です。</exception>
		/// <exception cref="System.IO.FileNotFoundException">ファイルが見つかりません。</exception>
		public CSVReaderEnumerable(int カラム数, string path, Encoding encoding, char 区切り文字)
			: base(path, encoding, 区切り文字)
		{
			this.カラム数 = カラム数;
		}
		#endregion
		#region public IEnumerable<IEnumerable<string>> RowEnumarble()  行を取得します。
		/// <summary>
		/// 行を取得します。
		/// </summary>
		/// <returns>CSVの行</returns>
		public IEnumerable<IEnumerable<string>> RowEnumarble()
		{
			//ファイルが終了するまで行を繰り返します。
			while (this.ファイル終了フラグ == false)
			{
				yield return Cols();
			}
			yield break;
		}
		#endregion
		#region public IEnumerable<string[]> RowArray()  行を取得します。
		/// <summary>
		/// 行を取得します。
		/// </summary>
		/// <returns>CSVの行</returns>
		public IEnumerable<string[]> RowArray()
		{
			//ファイルが終了するまで行を繰り返します。
			while (this.ファイル終了フラグ == false)
			{
				List<string> ReturnArray = new List<string>();
				foreach (string data in Cols())
				{
					ReturnArray.Add(data);
				}
				yield return ReturnArray.ToArray();
			}
			yield break;
		}
		#endregion
		#region public IEnumerable<List<string>> RowList()  行を取得します。
		/// <summary>
		/// 行を取得します。
		/// </summary>
		/// <returns>CSVの行</returns>
		public IEnumerable<List<string>> RowList()
		{
			//ファイルが終了するまで行を繰り返します。
			while (this.ファイル終了フラグ == false)
			{
				List<string> ReturnArray = new List<string>();
				foreach (string data in Cols())
				{
					ReturnArray.Add(data);
				}
				yield return ReturnArray;
			}
			yield break;
		}
		#endregion
		#region private IEnumerable<string> Cols()  カラムを取得します。
		/// <summary>
		/// カラムを取得します。
		/// </summary>
		/// <returns></returns>
		private IEnumerable<string> Cols()
		{
			for (int LoopCounter = 0; LoopCounter < this.カラム数; LoopCounter++)
			{
				yield return ReadColumn();
			}
			//行送り
			this.MoveNextRow();
			yield break;
		}
		#endregion
	}
}