中の技術日誌
 ホーム / 上へ

わんくまライブラリ Wankuma.IO.CSVクラス Version1

2005/01/21

この文書はVisual Studio 2003(.NET1.1)をベースに記述されています。それ以降のバージョンや、あなたが読んでいる時点では変更されている可能性があります。
またバージョンアップされている場合にはなんらかかの不具合を含んでいる可能性があります。

ドキュメントへ
Wankuma.IO.CSV1d.htm

ソースファイル直接ダウンロードへ
Wankuma.IO.CSV1c.txt

利用規約へ
../kiyaku.htm

using System;
using System.IO;
using System.Text;
using System.Data;

namespace Wankuma.IO
{
  /// <summary>
  /// CSV の概要の説明です。
  /// </summary>
  public class CSV
  {
    #region     public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数)

    /// <summary>
    /// CSVよりDataSetにデータを読み取ります。
    /// </summary>
    /// <param name="ファイル名">読み取る対象のファイル名</param>
    /// <param name="区切り文字">カンマ区切りの場合には','</param>
    /// <param name="最大カラム数">カラムの最大数</param>
    /// <returns>読み取りを行った結果のDataSet</returns>
    public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数)
    {
      return DataTable読み取り( ファイル名, 区切り文字, 最大カラム数, Encoding.GetEncoding("shift_jis") );
    }    

    #endregion
    #region       public static DataTable DataTable読み取り(string ファイル名, char 区切り文字, int 最大カラム数, Encoding encode)


    /// <summary>
    /// CSVよりDataTableにデータを読み取ります。
    /// </summary>
    /// <param name="ファイル名">読み取る対象のファイル名</param>
    /// <param name="区切り文字">カンマ区切りの場合には','</param>
    /// <param name="最大カラム数">カラムの最大数</param>
    /// <param name="encode">エンコード</param>
    /// <returns>読み取りを行った結果のDataSet</returns>
    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 最大カラム数)


    /// <summary>
    /// CSVよりDataSetにデータを読み取ります。
    /// </summary>
    /// <param name="stream">読み取る対象のストリーム</param>
    /// <param name="区切り文字">カンマ区切りの場合には','</param>
    /// <param name="最大カラム数">カラムの最大数</param>
    /// <returns>読み取りを行った結果のDataSet</returns>
    public static DataTable DataTable読み取り(StreamReader stream, char 区切り文字, int 最大カラム数)
    {
      return innerDataTable読み取り( stream.ReadToEnd(), 区切り文字, 最大カラム数);
    }    
    #endregion
    #region public static DataTable innerDataTable読み取り(string 処理対象行文字列, char 区切り文字, int 最大カラム数)
    /// <summary>
    /// CSVよりDataSetにデータを読み取ります。
    /// </summary>
    /// <param name="処理対象行文字列">読み取りデータ</param>
    /// <param name="区切り文字">カンマ区切りの場合には','</param>
    /// <param name="最大カラム数">カラムの最大数</param>
    /// <returns>読み取りを行った結果のDataSet</returns>
    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

勉強会: 05/18 大阪 登録受付中

中の技術日誌
コンテンツ
わんくま同盟
わんくま同盟
わんくま同盟
広告
バナー
MVP LOGO
MSMVP Visual C# Since 2004/04-2007/03
MCP LOGO
070-316
姉妹サイト
姉妹サイト:じゃんぬのC#, VB.NET 入門
じゃんぬの
C#, VB.NET 入門
検索
Google

ブログ本家
広告