我正在尝试将.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吗?它可以处理剥离""
吗?如何?
非常感谢。
答案 0 :(得分:5)
知道了,忘了将文字限定符设为"
:
答案 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;
}