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