zoukankan      html  css  js  c++  java
  • 正确解析以逗号分割的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;
      }

  • 相关阅读:
    禁止页面缓存 移动端
    常见的请求头与响应头介绍
    阮一峰 ES6学习
    禁止页面缩放 移动端
    10月30日学习日志
    11月7日学习日志
    11月6日学习日志
    10月31日学习日志
    11月1日学习日志
    11月9日学习日志
  • 原文地址:https://www.cnblogs.com/zhuor/p/282810.html
Copyright © 2011-2022 走看看