2010-09-21 69 views
3

我想将一个.csv文件插入到SQL Server 2008 R2中。如何批量使用双引号将csv插入所有值?

.csv从http://ipinfodb.com/ip_database.php完成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

...或者你可以使用正则表达式替换为stri p出双引号... – 2010-09-21 00:50:05

+0

文件太大,将永远剥离 – Henry 2010-09-21 03:04:25

+0

如果你想要走这条路,你可以在一个真实的文本编辑器,如Textpad或Ultraedit中打开它,并执行查找/替换引号用空字符串替换它们。我已经使用这些实用程序与180MB文件一起工作,这是无痛的 - 你可以试试它。 – Mayo 2010-09-21 11:52:10

回答

5

明白了,忘了设定文本限定符"

enter image description here

0

这是一个单一的进口,或者你想安排一个经常性的进口?如果这是一次性任务,则应该可以使用“导入和导出向导”。文本限定符将是引号(“),请确保在第一个数据行中选择列名称,并且您要传达的字段分隔符是分号(;)

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

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

+0

明天我会再次尝试导入和导出向导,但它今天早些时候一直在崩溃。 – Henry 2010-09-21 03:05:31

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; 
    } 
相关问题