如何在所有值周围使用双引号批量插入csv?

时间:2010-09-21 00:46:18

标签: sql-server sql-server-2008 csv bulkinsert

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

http://ipinfodb.com/ip_database.php完成后.csv为300 + MB (城市),4.0M记录。

以下是前5行,第1行=列标题:

"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";

我尝试了导入和导出数据以及BULK INSERT,但还未能正确导入它们。

我应该使用bcp吗?它可以处理剥离""吗?如何?

非常感谢。

4 个答案:

答案 0 :(得分:5)

知道了,忘了将文字限定符设为"

enter image description here

答案 1 :(得分:1)

您的数据看起来非常不一致,因为NULL值也不带引号封装。

我相信您可以创建一个格式文件来自定义您的特定csv文件及其在SQL SERVER中的特定终结符。

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

答案 2 :(得分:0)

这是一次导入还是您想安排定期导入?如果这是一次性任务,您应该能够使用“导入和导出向导”。文本限定符将是引号(“),请务必在第一个数据行中选择列名称,并且您要传达字段分隔符是分号(;)。< / p>

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

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

答案 3 :(得分:0)

在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;
    }