正确解析以逗号分割的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;
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值