白天有雨

此处应该有掌声

导航

正确解析以逗号分割的CSV文件

 /// <summary>
  /// 解析/// </summary>
  /// <param name="Source">csv字符串</param>
  /// <returns></returns>
  public ArrayList SplitCSV(string csvStr)
  {

   //获取联系人记录内容
   #region
   int sp = csvStr.IndexOf("\r\n");

   string head = csvStr.Substring(0, sp - 1);

   string record = csvStr.Substring(sp + 2);
   #endregion

   char[] s = record.ToCharArray();

   System.Text.StringBuilder strCol = new System.Text.StringBuilder();
   ArrayList arLne = new ArrayList();
   ArrayList arAll = new ArrayList();
   int cnter = 0; //双引号计数器

   for ( int i = 0 ; i < s.Length ; i++)
   {
    if ( s[i] == '\"')     //遇到双引号(字段结束符)
    {
     cnter++;                           //计数器加一
     strCol.Append(s[i]);               //此引号加入当前列
    }
    else if ( s[i] == ',') //遇到逗号(列结束符)
    {
     if (IsColumeOver(cnter))   //此逗号是列结束符,计数器清零,将当前列加入当前行
     {
      cnter = 0;
      arLne.Add(strCol);
      strCol = new System.Text.StringBuilder();
     }
     else                      //此逗号不是列结束符,逗号加入当前列
     {
      strCol.Append(s[i]);
     }
    }
    else if (s[i] == '\r') //遇到回车(行结束符)
    {
     if (IsLineOver(cnter))    //此回车是行结束符,计数器清零,将当前行加入结果数组
     {
      cnter = 0;
      arAll .Add(arLne);
      arLne = new ArrayList();
     }
     else                      //此回车不是行结束符,\r回车符加入当前列
     {
      strCol.Append(s[i]);
     }
    }
    else                   //正常数据(非字段、列、行结束符)
    {
     strCol.Append(s[i]);
    }
   }

   return arAll ;
  }

  /// <summary>
  /// 当前列是否已读完
  /// </summary>
  /// <param name="cnter"></param>
  /// <returns></returns>
  private bool IsColumeOver(double cnter)
  {
   return System.Math.IEEERemainder((double)cnter,2) == 0;
  }

  /// <summary>
  /// 当前行是否已读完
  /// </summary>
  /// <param name="cnter"></param>
  /// <returns></returns>
  private bool IsLineOver(double cnter)
  {
   return System.Math.IEEERemainder((double)cnter,2) == 0;
  }

posted on 2005-11-23 14:40  卓如  阅读(694)  评论(0编辑  收藏  举报