none
请问 C# 如何读取CSV 文件 关键是CSV 文件包含引号 RRS feed

答案

  • 用 string 的 Split 不能 处理 当CSV文件中引号内包含 逗号 的情况  

    正如这句  "\"Sales Record Number,fdfadasaas,sdsd\"  用Split 会将其分成三段  

    我贴出  处理CSV文件后将其保存进 SQL 的代码

     #region 利用文件流的方式处理CSV

      //tablename 数据库中数据表名   //path 文件物理地址

            public bool InsertBonamartAll(string tablename, string path, SqlConnection con, SqlCommand com)
            {
                string sql = "";
                string strstr = "";
                int count = 0;
                Regex CSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");  
                try
                {
                    string[] strline = File.ReadAllLines(path, System.Text.Encoding.GetEncoding("ISO-8859-1")); //打开CSV文件
                    if (strline.Length <= 0)
                    {
                        return false;
                    }
                    foreach (string str in strline)
                    {
                        count++;
                        if (count > 1)//因为只需要提取CSV文件中的值,所以第一行的表名不需要提供
                        {
                            String[] arr = CSVParser.Split(str);//根据正则分隔数据
                            for (int i = 0; i < arr.Length; i++)
                            {
                                arr[i] = arr[i].TrimStart(' ', '"');
                                arr[i] = arr[i].TrimEnd('"');
                                strstr += arr[i] + ",";
                            }
                            if (arr.Length < 20)
                            {
                                string[] strs = strstr.Split(',');
                                sql = "insert into " + tablename + "([Item ID],[Custom Label])" + " " + "values('" + strs[0] + "','" + strs[1] + "')";
                                com.Connection = con;
                                com.CommandText = sql;
                                int coutss = com.ExecuteNonQuery();
                                if (coutss < 1)
                                {
                                    return false;
                                }
                                strstr = "";
                                continue;
                            }                      
                            sql = "insert into " + tablename + " " + "values('" + arr[0] + "','" + arr[1] + "','" + arr[2] + "','" + arr[3] + "','" + arr[4] + "','" + arr[5] + "','" + arr[6] + "','" + arr[7] + "','" + arr[8] + "','" + arr[9] + "','" + arr[10] + "','" + arr[11] + "','" + arr[12] + "','" + Return_Str(arr[13]) + "','" + Return_Str(arr[14]) + "','" + arr[15] + "','" + arr[16] + "','" + arr[17] + "','" + arr[18] + "','" + arr[19] + "','" + arr[20] + "','" + arr[21] + "','" + DateTime.Now + "')";
                            com.Connection = con;
                            com.CommandText = sql;
                            int cout = com.ExecuteNonQuery();
                            if (cout < 1)
                            {
                                return false;
                            }
                        }
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
            #endregion


    • 已建议为答案 ThankfulHeart 2013年6月13日 6:48
    • 已标记为答案 唐海 2013年6月13日 9:46
    2013年6月13日 6:48

全部回复

  • 问题我自己解决  

    解决方案:  

     string s = "\"Sales Record Number,fdfadasaas,sdsd\",User Id,Buyer Fullname,Buyer Phone Number,Buyer Email,Buyer Address 1,Buyer Address 2,Buyer City,Buyer State,Buyer Zip,Buyer Country,Order ID,Item ID,Transaction ID";
                Regex r = new Regex("(([^,^\"])*(\".*\")*([^,^\"])*)(,|$)");   // 完美的解析了双引号所包含逗号的问题  
                for (Match m = r.Match(s); m.Success; m = m.NextMatch())
                {
                    Console.WriteLine(m.Value);
                }
                Console.Read();

    希望能对碰到同样问题的朋友一些帮助。

    2013年6月13日 3:23
  • 直接用string的Split对英文逗号分隔应该也可以。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月13日 5:41
  • 用 string 的 Split 不能 处理 当CSV文件中引号内包含 逗号 的情况  

    正如这句  "\"Sales Record Number,fdfadasaas,sdsd\"  用Split 会将其分成三段  

    我贴出  处理CSV文件后将其保存进 SQL 的代码

     #region 利用文件流的方式处理CSV

      //tablename 数据库中数据表名   //path 文件物理地址

            public bool InsertBonamartAll(string tablename, string path, SqlConnection con, SqlCommand com)
            {
                string sql = "";
                string strstr = "";
                int count = 0;
                Regex CSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");  
                try
                {
                    string[] strline = File.ReadAllLines(path, System.Text.Encoding.GetEncoding("ISO-8859-1")); //打开CSV文件
                    if (strline.Length <= 0)
                    {
                        return false;
                    }
                    foreach (string str in strline)
                    {
                        count++;
                        if (count > 1)//因为只需要提取CSV文件中的值,所以第一行的表名不需要提供
                        {
                            String[] arr = CSVParser.Split(str);//根据正则分隔数据
                            for (int i = 0; i < arr.Length; i++)
                            {
                                arr[i] = arr[i].TrimStart(' ', '"');
                                arr[i] = arr[i].TrimEnd('"');
                                strstr += arr[i] + ",";
                            }
                            if (arr.Length < 20)
                            {
                                string[] strs = strstr.Split(',');
                                sql = "insert into " + tablename + "([Item ID],[Custom Label])" + " " + "values('" + strs[0] + "','" + strs[1] + "')";
                                com.Connection = con;
                                com.CommandText = sql;
                                int coutss = com.ExecuteNonQuery();
                                if (coutss < 1)
                                {
                                    return false;
                                }
                                strstr = "";
                                continue;
                            }                      
                            sql = "insert into " + tablename + " " + "values('" + arr[0] + "','" + arr[1] + "','" + arr[2] + "','" + arr[3] + "','" + arr[4] + "','" + arr[5] + "','" + arr[6] + "','" + arr[7] + "','" + arr[8] + "','" + arr[9] + "','" + arr[10] + "','" + arr[11] + "','" + arr[12] + "','" + Return_Str(arr[13]) + "','" + Return_Str(arr[14]) + "','" + arr[15] + "','" + arr[16] + "','" + arr[17] + "','" + arr[18] + "','" + arr[19] + "','" + arr[20] + "','" + arr[21] + "','" + DateTime.Now + "')";
                            com.Connection = con;
                            com.CommandText = sql;
                            int cout = com.ExecuteNonQuery();
                            if (cout < 1)
                            {
                                return false;
                            }
                        }
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
            #endregion


    • 已建议为答案 ThankfulHeart 2013年6月13日 6:48
    • 已标记为答案 唐海 2013年6月13日 9:46
    2013年6月13日 6:48
  • 哦,你是双引号包含了逗号,Sorry没有看清:)

    你可以标记自己为答案哦,谢谢分享!


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月13日 6:50