2008-09-18 132 views
23

我需要将大型CSV文件导入SQL服务器。我使用的是这样的:从SQL导入CSV批量

BULK 
INSERT CSVTest 
     FROM 'c:\csvfile.txt' 
      WITH 
    (
       FIELDTERMINATOR = ',', 
       ROWTERMINATOR = '\n' 
    ) 
GO 

问题是我所有的字段都用双引号(”“),以便行实际上看起来像包围:

"1","","2","","sometimes with comma , inside", "" 

我可以采用某种批量导入他们,告诉SQL来使用引号作为字段分隔符?

编辑:使用的问题“”,“”作为分隔符,如建议的例子是: 最令例子做的,是他们导入数据,包括在第一列的第一个”和最后“最后,他们继续前进,并将其解决。唉,我的第一个(也是最后一个)列是日期时间,不会允许“20080902作为日期时间导入。

从我一直在阅读arround我认为FORMATFILE是要走的路,但文档(包括MSDN)是非常unhelpfull。

+0

你应该插入散装行重新标记这个sqlserver所以我们知道你使用的是什么数据库。 – JasonS 2008-09-18 20:23:19

回答

3

我知道这不是一个真正的解决方案,但我使用一个虚拟表进行nvarchar设置为一切。然后我做了一个插入,它去掉了“字符并进行了转换,它不是很漂亮,但它的确如此。”

13

尝试FIELDTERMINATOR='","'

这里是有很大的联系,以帮助第一和最后报价...看看他是如何使用的子串的SP

http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

+0

它不会工作:-(。表中的第一个字段是日期时间,它将导入带引号的前导引号(“),并生成一个错误 – Radu094 2008-09-18 20:23:51

+1

还要小心应用程序导出带引号的字符串但没有引用数字的CSV。 – finnw 2008-09-18 20:30:07

+1

也适用于我,我使用的是xml格式的文件,因此使用了Terminator属性而不是FIELDTERMINATOR。另外,在我最后一列中,我使用了以下TERMINATOR ='“\ r \ n' – 2009-05-06 17:55:22

1

你需要以编程方式执行此操作,还是一次性拍摄?

使用企业管理器,右键单击导入数据可让您选择您的分隔符。

4

尝试OpenRowSet。这可以用来导入Excel的东西。 Excel可以打开CSV文件,所以你只需要找出正确的[ConnectionString] [2]。驱动程序= {Microsoft Text Driver(* .txt; * .csv)}; Dbq = c:\ txtFilesFolder \; Extensions = asc,csv,tab,txt;

0

你也可以使用DTS或SSIS。

1

您必须小心使用BCP/BULK INSERT,因为即使格式文件(即使XML格式文件不提供选项)和dummy [“|”“),如果引用不一致,BSP或Bulk Insert也不会处理此问题, ]开头和结尾的字符,并且使用[“,”]作为分隔符。如果没有嵌入字符,技术上CSV文件不需要[]]字符

因为这个原因逗号 - 有限文件有时被称为喜剧限制文件。

OpenRowSet将需要服务器上的Excel,并可能在64位环境中出现问题 - 我知道使用Excel中的64位Jet是有问题的。

如果该文件可能与您未来的期望有所不同,SSIS确实是您最好的选择。

0

您是否可以控制输入格式? | (管道),通常用于更好的现场终结器。

0

如果你弄清楚如何将文件解析成一个DataTable,我会建议SqlBulkInsert类将其插入SQL服务器

1

ü可以试试这个代码,如果你想这是非常甜蜜的, 这会从您的代码中删除不必要的分号 例如,如果你的数据是这样的:。
“凯莉” ,“雷诺”,“[email protected]

Bulk insert test1 
from 'c:\1.txt' with ( 
    fieldterminator ='","' 
    ,rowterminator='\n') 

update test1<br> 
set name =Substring (name , 2,len(name)) 
where name like **' "% '** 

update test1 
set email=substring(email, 1,len(email)-1) 
where email like **' %" '** 
9

我有时使用的另一种黑客攻击是在Excel中打开CSV,然后在每行末尾将单元格写入单元格。 例如:

=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")") 

一个向下填充可以填充到每一个行你这一点。然后将输出复制并粘贴到新的查询窗口中。

这是一所古老的学校,但如果您只需要一段时间进行一次导入,那么您可以节省阅读所有关于“正确”方式的难懂文档。

1

杉杉需要导入CSV文件分成多个数据表

然后你就可以使用SqlBulkCopy的

using System; 
using System.Data; 
using System.Data.SqlClient; 

namespace SqlBulkInsertExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable prodSalesData = new DataTable("ProductSalesData"); 

      // Create Column 1: SaleDate 
      DataColumn dateColumn = new DataColumn(); 
      dateColumn.DataType = Type.GetType("System.DateTime"); 
      dateColumn.ColumnName = "SaleDate"; 

      // Create Column 2: ProductName 
      DataColumn productNameColumn = new DataColumn(); 
      productNameColumn.ColumnName = "ProductName"; 

      // Create Column 3: TotalSales 
      DataColumn totalSalesColumn = new DataColumn(); 
      totalSalesColumn.DataType = Type.GetType("System.Int32"); 
      totalSalesColumn.ColumnName = "TotalSales"; 

      // Add the columns to the ProductSalesData DataTable 
      prodSalesData.Columns.Add(dateColumn); 
      prodSalesData.Columns.Add(productNameColumn); 
      prodSalesData.Columns.Add(totalSalesColumn); 

      // Let's populate the datatable with our stats. 
      // You can add as many rows as you want here! 

      // Create a new row 
      DataRow dailyProductSalesRow = prodSalesData.NewRow(); 
      dailyProductSalesRow["SaleDate"] = DateTime.Now.Date; 
      dailyProductSalesRow["ProductName"] = "Nike"; 
      dailyProductSalesRow["TotalSales"] = 10; 

      // Add the row to the ProductSalesData DataTable 
      prodSalesData.Rows.Add(dailyProductSalesRow); 

      // Copy the DataTable to SQL Server using SqlBulkCopy 
      using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;")) 
      { 
       dbConnection.Open(); 
       using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) 
       { 
        s.DestinationTableName = prodSalesData.TableName; 

        foreach (var column in prodSalesData.Columns) 
         s.ColumnMappings.Add(column.ToString(), column.ToString()); 

        s.WriteToServer(prodSalesData); 
       } 
      } 
     } 
    } 
}