2008-09-18 170 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); 
       } 
      } 
     } 
    } 
}