代码之家  ›  专栏  ›  技术社区  ›  Henry

如何在所有值周围大容量插入带双引号的csv?

  •  3
  • Henry  · 技术社区  · 14 年前

    我正在尝试将.csv文件插入到SQL Server 2008 R2中。

    .csv是300+MB来自 http://ipinfodb.com/ip_database.php 完成 (城市),4.0米记录。

    这是前5行,第一行=列标题:

    "ip_start";"country_code";"country_name";"region_code";"region_name";"city";"zipcode";"latitude";"longitude";"metrocode"
    "0";"RD";"Reserved";;;;;"0";"0";
    "16777216";"AU";"Australia";;;;;"-27";"133";
    "17367040";"MY";"Malaysia";;;;;"2.5";"112.5";
    "17435136";"AU";"Australia";;;;;"-27";"133";
    

    我尝试了导入和导出数据以及批量插入,但还不能正确导入。

    我应该使用BCP吗?它能处理剥皮吗 "" ?怎样?

    非常感谢。

    4 回复  |  直到 11 年前
        1
  •  5
  •   Kobi    12 年前

    明白了,忘记设定了 文本限定符 作为 " :

    enter image description here

        2
  •  1
  •   el_stack    14 年前

    您的数据看起来非常不一致,因为空值也不包含报价附件。

    我相信您可以创建一个格式化文件来定制特定的csv文件及其在SQL Server中的特定终止符。

    在此处查看更多信息: http://lanestechblog.blogspot.com/2008/08/sql-server-bulk-insert-using-format.html

        3
  •  0
  •   Mayo    14 年前

    这是单次导入还是计划定期导入?如果这是一次性任务,您应该能够使用导入和导出向导。文本限定符将是引号(“),请务必选择 第一个数据行中的列名 ,您将希望传递字段分隔符是分号(;)。

    我不确定文件的格式是否正确-每个数据行后面的最后一个分号可能有问题。如果遇到任何错误,只需在文件中添加一个新的列标题。

    编辑:我刚刚做了一个快速测试,末尾的分号将被视为该行中最终值的一部分。我建议在头(第一行)的末尾添加一个“tempheader”,这将导致SQL将最后的分号视为分隔符,并且在导入完成后可以删除该额外的列。

        4
  •  0
  •   Vishal Sen    11 年前

    在C中,您可以使用此代码,为我工作

     public bool CSVFileRead(string fullPathWithFileName, string fileNameModified, string tableName)
        {
            SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["dbConnectionString"]);
            string filepath = fullPathWithFileName;
            StreamReader sr = new StreamReader(filepath);
            string line = sr.ReadLine();
            string[] value = line.Split(',');
            DataTable dt = new DataTable();
            DataRow row;
            foreach (string dc in value)
            {
                dt.Columns.Add(new DataColumn(dc));
            }
            while (!sr.EndOfStream)
            {
                //string[] stud = sr.ReadLine().Split(',');
                //for (int i = 0; i < stud.Length; i++)
                //{
                //    stud[i] = stud[i].Replace("\"", "");
                //}
                //value = stud;
                value = sr.ReadLine().Split(',');
                if (value.Length == dt.Columns.Count)
                {
                    row = dt.NewRow();
                    row.ItemArray = value;
                    dt.Rows.Add(row);
                }
            }
            SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
            bc.DestinationTableName = tableName;
            bc.BatchSize = dt.Rows.Count;
            con.Open();
            bc.WriteToServer(dt);
            bc.Close();
            con.Close();
    
            return true;
        }