using System; using System.IO; using System.Text; using System.Data; namespace Wankuma.IO { /// /// CSV の概要の説明です。 /// public class CSV { #region public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数) /// /// CSVよりDataSetにデータを読み取ります。 /// /// 読み取る対象のファイル名 /// カンマ区切りの場合には',' /// カラムの最大数 /// 読み取りを行った結果のDataSet public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数) { return DataTable読み取り( ファイル名, 区切り文字, 最大カラム数, Encoding.GetEncoding("shift_jis") ); } #endregion #region public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数, Encoding encode) /// /// CSVよりDataTableにデータを読み取ります。 /// /// 読み取る対象のファイル名 /// カンマ区切りの場合には',' /// カラムの最大数 /// エンコード /// 読み取りを行った結果のDataSet public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数, Encoding encode) { //ファイルから読み込むためのリーダを作成する using ( StreamReader sr = new StreamReader(ファイル名, encode)) { try { return DataTable読み取り(sr, 区切り文字, 最大カラム数); } finally { sr.Close(); } } } #endregion #region public static DataTable DataTable読み取り(StreamReader stream, char 区切り文字, int 最大カラム数) /// /// CSVよりDataSetにデータを読み取ります。 /// /// 読み取る対象のストリーム /// カンマ区切りの場合には',' /// カラムの最大数 /// 読み取りを行った結果のDataSet public static DataTable DataTable読み取り(StreamReader stream, char 区切り文字, int 最大カラム数) { return innerDataTable読み取り( stream.ReadToEnd(), 区切り文字, 最大カラム数); } #endregion #region public static DataTable innerDataTable読み取り(string 処理対象行文字列, char 区切り文字, int 最大カラム数) /// /// CSVよりDataSetにデータを読み取ります。 /// /// 読み取りデータ /// カンマ区切りの場合には',' /// カラムの最大数 /// 読み取りを行った結果のDataSet public static DataTable innerDataTable読み取り(string 処理対象行文字列, char 区切り文字, int 最大カラム数) { //読込先のDatasetを作成する DataTable dt = new DataTable(); for ( int LoopCounter = 0; LoopCounter < 最大カラム数; LoopCounter++ ) { DataColumn dc = new DataColumn(); dt.Columns.Add(dc); } //CSV読み取り処理を実行する DataRow dr = dt.NewRow(); bool 文字列処理中 = false; bool ダブルクォート処理中 = false; bool CR処理中 = false; int カラム番号 = 0; StringBuilder sb = new StringBuilder(); foreach( char 処理対象文字 in 処理対象行文字列 ) { if ( CR処理中 == true && 処理対象文字 != '\n' ) { CR処理中 = false; } if ( 文字列処理中 == true && ダブルクォート処理中 == true && 処理対象文字 != '"') { 文字列処理中 = false; ダブルクォート処理中 = false; } if ( 処理対象文字 == '"' ) { if ( 文字列処理中 == false ) { 文字列処理中 = true; } else { if ( ダブルクォート処理中 == false ) { ダブルクォート処理中 = true; } else { sb.Append(処理対象文字); ダブルクォート処理中 = false; } } } else { if ( 文字列処理中 == true ) { if ( 処理対象文字 == '\n' ) { sb.Append("\r\n"); } else if ( 処理対象文字 == '\r' ) { } else { sb.Append(処理対象文字); } } else { if ( 処理対象文字 == '\r' ) { CR処理中 = true; } else if ( 処理対象文字 == '\n' ) { if ( CR処理中 == true ) { if ( カラム番号 != 最大カラム数 ) { dr[カラム番号] = sb.ToString(); カラム番号++; } //最大カラム数まで""でうめる while ( カラム番号 < 最大カラム数 ) { dr[カラム番号] = ""; カラム番号++; } //改行処理 dt.Rows.Add(dr); dr = dt.NewRow(); sb = new StringBuilder(); カラム番号 = 0; 文字列処理中 = false; ダブルクォート処理中 = false; CR処理中 = false; } } else if ( 処理対象文字 == 区切り文字 ) { if ( カラム番号 == 最大カラム数 ) { break; } else { dr[カラム番号] = sb.ToString(); sb = new StringBuilder(); カラム番号++; } } else { sb.Append(処理対象文字); } } } } return dt; } #endregion }//class }//namespace