Bootstrap

读取csv文件数据到DataTable

//读取csv数据到数据库
            string conStr = ConfigurationManager.AppSettings["connectionString"].ToString();//数据库连接字符串
            for (int i = 10; i < 13; i++)
            {
                DataTable dt = GetDataTable(@"C:\Users\wchi\Desktop\2020" + i + @"\2020" + i + ".csv");
                SqlBulkCopyInsert(conStr, "wx_zy_Order", dt);//wx_zy_Order数据库表名
            }

 

 public DataTable GetDataTable(string fileNamestr)
        {
            try
            {
                IsFirst = true;
                rowAL = new ArrayList();
                fileName = fileNamestr;
                encoding = Encoding.Default;
                return LoadCsvFile();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return null;
            }
        }

 

/// <summary>
        /// 载入CSV文件
        /// </summary>
        private static DataTable LoadCsvFile()
        {
            //对数据的有效性进行验证
            if (fileName == null)
            {
                throw new Exception("请指定要载入的CSV文件名");
            }
            else if (!File.Exists(fileName))
            {
                throw new Exception("指定的CSV文件不存在");
            }
            else
            {
            }
            if (encoding == null)
            {
                encoding = Encoding.Default;
            }
            DataTable dt = new DataTable();
            StreamReader sr = new StreamReader(fileName, encoding);
            string csvDataLine;

            csvDataLine = "";
            while (true)
            {
                try
                {
                    string fileDataLine;
                    fileDataLine = sr.ReadLine();
                    if (fileDataLine == null)
                    {
                        break;
                    }
                    if (csvDataLine == "")
                    {
                        fileDataLine = fileDataLine.Replace("`", "");
                        csvDataLine = fileDataLine;
                    }
                    else
                    {
                        csvDataLine += "\r\n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
                    }
                    //如果包含偶数个引号,说明该行数据中出现回车符或包含逗号
                    if (!IfOddQuota(csvDataLine))
                    {
                        AddNewDataLine(csvDataLine, dt);
                        csvDataLine = "";
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            sr.Close();
            //数据行出现奇数个引号
            if (csvDataLine.Length > 0)
            {
                //throw new Exception("CSV文件的格式有错误");
            }
            return dt;
        }

 

 

/// <summary>
        /// 判断字符串是否包含奇数个引号
        /// </summary>
        /// <param name="dataLine">数据行</param>
        /// <returns>为奇数时,返回为真;否则返回为假</returns>
        private static bool IfOddQuota(string dataLine)
        {
            int quotaCount;
            bool oddQuota;

            quotaCount = 0;
            for (int i = 0; i < dataLine.Length; i++)
            {
                if (dataLine[i] == '\"')
                {
                    quotaCount++;
                }
            }

            oddQuota = false;
            if (quotaCount % 2 == 1)
            {
                oddQuota = true;
            }

            return oddQuota;
        }

 

/// <summary>
        /// 加入新的数据行
        /// </summary>
        /// <param name="newDataLine">新的数据行</param>
        private static void AddNewDataLine(string newDataLine, DataTable dt)
        {
            int Column = 0;
            DataRow Row = dt.NewRow();
            ArrayList colAL = new ArrayList();
            string[] dataArray = newDataLine.Split(',');
            bool oddStartQuota; //是否以奇数个引号开始
            string cellData;

            oddStartQuota = false;
            cellData = "";

            for (int j = 0; j < dataArray.Length; j++)
            {
                if (IsFirst)
                {
                    DataColumn dc = new DataColumn(dataArray[j]);
                    dt.Columns.Add(dc);
                }
                else
                {
                    if (oddStartQuota)
                    {
                        //因为前面用逗号分割,所以要加上逗号
                        cellData += "," + dataArray[j];
                        //是否以奇数个引号结尾
                        if (IfOddEndQuota(dataArray[j]))
                        {

                            Row[Column] = GetHandleData(cellData);
                            Column++;
                            oddStartQuota = false;
                            continue;
                        }
                    }
                    else
                    {
                        //是否以奇数个引号开始
                        if (IfOddStartQuota(dataArray[j]))
                        {
                            //是否以奇数个引号结尾,不能是一个双引号,并且不是奇数个引号

                            if (IfOddEndQuota(dataArray[j]) && dataArray[j].Length > 2 && !IfOddQuota(dataArray[j]))
                            {

                                Row[Column] = GetHandleData(dataArray[j]);
                                Column++;
                                oddStartQuota = false;
                                continue;
                            }
                            else
                            {
                                oddStartQuota = true;
                                cellData = dataArray[j];
                                continue;
                            }
                        }
                        else
                        {
                            Row[Column] = GetHandleData(dataArray[j]);
                            Column++;
                        }
                    }

                }
            }

            if (!IsFirst)
            {
                dt.Rows.Add(Row);
            }
            IsFirst = false;
            if (oddStartQuota)
            {
                throw new Exception("数据格式有问题");
            }

        }

 

/// <summary>
        /// 去掉格子的首尾引号,把双引号变成单引号

        /// </summary>
        /// <param name="fileCellData"></param>
        /// <returns></returns>
        private static string GetHandleData(string fileCellData)
        {
            if (fileCellData == "")
            {
                return "";
            }
            if (IfOddStartQuota(fileCellData))
            {
                if (IfOddEndQuota(fileCellData))
                {
                    return fileCellData.Substring(1, fileCellData.Length - 2).Replace("\"\"", "\""); //去掉首尾引号,然后把双引号变成单引号
                }
                else
                {
                    throw new Exception("数据引号无法匹配" + fileCellData);
                }
            }
            else
            {
                //考虑形如"" """" """"""
                if (fileCellData.Length > 2 && fileCellData[0] == '\"')
                {
                    fileCellData = fileCellData.Substring(1, fileCellData.Length - 2).Replace("\"\"", "\""); //去掉首尾引号,然后把双引号变成单引号
                }
            }

            return fileCellData;
        }

 

/// <summary>
        /// 判断是否以奇数个引号开始

        /// </summary>
        /// <param name="dataCell"></param>
        /// <returns></returns>
        private static bool IfOddStartQuota(string dataCell)
        {
            int quotaCount;
            bool oddQuota;

            quotaCount = 0;
            for (int i = 0; i < dataCell.Length; i++)
            {
                if (dataCell[i] == '\"')
                {
                    quotaCount++;
                }
                else
                {
                    break;
                }
            }

            oddQuota = false;
            if (quotaCount % 2 == 1)
            {
                oddQuota = true;
            }

            return oddQuota;
        }

 

/// <summary>
        /// 判断是否以奇数个引号结尾
        /// </summary>
        /// <param name="dataCell"></param>
        /// <returns></returns>
        private static bool IfOddEndQuota(string dataCell)
        {
            int quotaCount;
            bool oddQuota;

            quotaCount = 0;
            for (int i = dataCell.Length - 1; i >= 0; i--)
            {
                if (dataCell[i] == '\"')
                {
                    quotaCount++;
                }
                else
                {
                    break;
                }
            }

            oddQuota = false;
            if (quotaCount % 2 == 1)
            {
                oddQuota = true;
            }

            return oddQuota;
        }

;