[英]Import CSV file into SQL Server
我正在尋求使用BULK INSERT
將.csv
文件導入 SQL Server 的幫助,但我有幾個基本問題。
問題:
CSV 文件數據之間可能有,
(逗號)(例如:描述),那么如何進行導入處理這些數據?
如果客戶端從 Excel 創建 CSV,則帶有逗號的數據包含在""
(雙引號)內 [如下例] 那么導入如何處理這個問題?
我們如何跟蹤某些行是否有錯誤數據,哪些導入會跳過? (導入是否會跳過不可導入的行)
這是帶有標題的示例 CSV:
Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.
以及要導入的 SQL 語句:
BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
基於 SQL Server CSV 導入
1) CSV 文件數據之間可能有
,
(逗號)(例如:描述),那么我該如何導入處理這些數據?
解決方案
如果您使用,
(逗號)作為分隔符,則無法區分作為字段終止符的逗號和數據中的逗號。 我會使用不同的FIELDTERMINATOR
如||
. 代碼看起來像這樣,這將完美地處理逗號和單斜杠。
2)如果客戶端從 excel 創建 csv 則帶有逗號的數據包含在
" ... "
(雙引號)內[如下例]那么導入如何處理?
解決方案
如果您使用 BULK 插入,則無法處理雙引號,數據將使用雙引號插入行中。 將數據插入表后,您可以用 ' 替換那些雙引號 '。
update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
3)我們如何跟蹤某些行是否有錯誤數據,哪些導入會跳過? (導入是否會跳過不可導入的行)?
解決方案
要處理由於無效數據或格式而未加載到表中的行,可以使用ERRORFILE 屬性進行處理,指定錯誤文件名,它將把有錯誤的行寫入錯誤文件。 代碼應該看起來像。
BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv',
TABLOCK
)
您首先需要在您的數據庫中創建一個表,您將在其中導入 CSV 文件。 創建表后,請按照以下步驟操作。
• 使用 SQL Server Management Studio 登錄您的數據庫
• 右鍵單擊您的數據庫並選擇Tasks -> Import Data...
• 單擊Next >
按鈕
• 對於數據源,選擇Flat File Source
。 然后使用瀏覽按鈕選擇 CSV 文件。 在單擊Next >
按鈕之前,花一些時間配置您希望如何導入數據。
• 對於目標,選擇正確的數據庫提供程序(例如,對於 SQL Server 2012,您可以使用 SQL Server Native Client 11.0)。 輸入服務器名稱。 選中Use SQL Server Authentication
單選按鈕。 在單擊Next >
按鈕之前輸入用戶名、密碼和數據庫。
• 在選擇源表和視圖窗口中,您可以在單擊Next >
按鈕之前編輯映射。
• 選中Run immediately
復選框並單擊Next >
按鈕。
• 單擊Finish
按鈕運行包。
2)如果客戶端從 excel 創建 csv 則帶有逗號的數據包含在“...”(雙引號)內[如下例]那么導入如何處理?
您應該使用 FORMAT = 'CSV', FIELDQUOTE = '"' 選項:
BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
FORMAT = 'CSV',
FIELDQUOTE = '"',
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
解決數據中逗號問題的最佳、最快和最簡單的方法是在將 Windows 的列表分隔符設置為逗號以外的其他設置(例如管道)后,使用 Excel 保存逗號分隔的文件。 然后,這將為您生成一個管道(或其他)分隔文件,然后您可以導入該文件。 這在此處進行了描述。
首先需要將 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);
}
}
}
}
}
這是我將如何解決它:
只需將您的 CSV 文件另存為 Excel 中的 XLS 表(這樣做,您就不必擔心分隔符。Excel 的電子表格格式將被讀取為表格並直接導入到 SQL 表格中)
使用 SSIS 導入文件
在導入管理器中編寫自定義腳本以省略/修改您要查找的數據。(或運行主腳本來仔細檢查您要刪除的數據)
祝你好運。
因為他們不使用 SQL 導入向導,所以步驟如下:
右鍵單擊選項任務中的數據庫以導入數據,
打開向導后,我們選擇要隱含的數據類型。 在這種情況下,它將是
平面文件源
我們選擇CSV文件,可以在CSV中配置表格的數據類型,但是最好從CSV中帶過來。
SQL客戶端
根據我們選擇的身份驗證類型,一旦完成,就會出現一個非常重要的選項。
啟用 ID 插入
(通常不是從 1 開始),相反,如果我們在 CSV 中有一個帶有 id 的列,我們選擇啟用 id 插入,下一步是結束向導,我們可以在這里查看更改。
另一方面,在接下來的窗口中可能會出現alerts,或者warnings,理想的情況是忽略這一點,只有當他們留下error時才需要注意。
我知道這不是上述問題的確切解決方案,但對我來說,當我嘗試將數據從位於單獨服務器上的一個數據庫復制到本地時,這是一場噩夢。
我試圖通過首先將數據從服務器導出到CSV/txt
然后將其導入到我的本地表來做到這一點。
兩種解決方案:寫下導入CSV
的查詢或使用 SSMS導入數據向導總是會產生錯誤(錯誤非常普遍,表示存在解析問題)。 雖然我沒有做任何特別的事情,只是導出到CSV
然后嘗試將CSV
導入到本地DB
,但錯誤總是存在。
我試圖查看映射部分和數據預覽,但總是有很大的混亂。 而且我知道主要問題來自table
列之一,該列包含JSON
而SQL
解析器錯誤地處理了該列。
所以最終,我想出了一個不同的解決方案,並希望分享它,以防其他人遇到類似的問題。
我所做的是在外部服務器上使用了導出向導。
以下是重復相同過程的步驟:
1) 右鍵單擊數據庫並選擇Tasks -> Export Data...
2) 當向導打開時,選擇下一步並在“數據源:”的位置選擇“SQL Server Native Client”。
對於外部服務器,您很可能必須為“身份驗證模式:”選擇“使用 SQL Server 身份驗證”。
3) 點擊Next 后,您必須選擇Destination 。
為此,再次選擇“SQL Server Native Client”。
這次您可以提供您的本地(或其他一些外部DB
) DB
。
4) 點擊下一步按鈕后,您有兩種選擇,要么將整個表從一個DB
復制到另一個DB
,要么寫下查詢以指定要復制的確切數據。 就我而言,我不需要整個表(它太大),而只需要其中的一部分,因此我選擇了“編寫查詢以指定要傳輸的數據”。
我建議在移動到向導之前,在單獨的查詢編輯器上寫下並測試查詢。
5) 最后,您需要指定將選擇數據的目標表。
我建議將其保留為
[dbo].[Query]
或一些自定義Table
名稱,以防萬一導出數據時出錯,或者您不確定數據並希望在移至所需的確切表之前對其進行進一步分析.
現在點擊下一步/完成按鈕直接進入向導的結尾。
如果您的數據是“干凈的”(沒有違反數據約束等)並且您有權將文件放在服務器上,那么這里的所有答案都很好用。 如果使用 SSMS 的內置導入任務,此處提供的一些答案會在第一個錯誤(PK 違規、數據丟失錯誤等)處停止,並且一次給您一個錯誤。 如果您想一次收集所有錯誤(以防您想告訴給您 .csv 文件的人清理他們的數據),我推薦以下作為答案。 當您自己“編寫”SQL 時,此答案還為您提供了完全的靈活性。
注意:我將假設您運行的是 Windows 操作系統並且可以訪問 Excel 和 SSMS。 如果沒有,我相信您可以調整此答案以滿足您的需求。
使用 Excel 打開您的 .csv 文件。 在一個空列中,您將編寫一個公式,該公式將構建單獨的INSERT
語句,例如=CONCATENATE("INSERT INTO dbo.MyTable (FirstName, LastName) VALUES ('", A1, "', '", B1,"')", CHAR(10), "GO")
,其中 A1 是具有名字數據的單元格,而 A2 具有姓氏數據。
CHAR(10)
在最終結果中添加一個換行符, GO
將允許我們運行此INSERT
並繼續下一個,即使有任何錯誤。 使用=CONCATENATION()
公式突出顯示單元格
Shift + End 突出顯示其余行中的同一列
在功能區 > 主頁 > 編輯 > 填充 > 單擊向下
Ctrl + C 復制制定的 SQL INSERT
語句
粘貼到 SSMS
您會注意到 Excel 可能出乎意料地在您的每個INSERT
和GO
命令周圍添加了雙引號。 這是從 Excel 中復制多行值的“功能”(?) 。 您可以簡單地找到並分別用INSERT
和GO
替換"INSERT
and GO"
來清理它。
最后,您已准備好運行導入過程
該過程完成后,檢查消息窗口是否有任何錯誤。 您可以選擇所有內容 (Ctrl + A) 並復制到 Excel 中,然后使用列過濾器刪除任何成功的消息,然后留下所有錯誤。
這個過程肯定會比這里的其他答案花費更長的時間,但是如果您的數據“臟”並且充滿 SQL 違規,您至少可以一次收集所有錯誤並將它們發送給提供數據的人,如果是你的場景。
如上所述,您需要添加FORMAT
和FIELDQUOTE
選項以將.CSV
數據批量插入 SQL Server。 對於您的情況,SQL 語句將如下所示:
BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
FORMAT = 'CSV',
FIELDQUOTE = '""',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
)
盡管 SSMS 中的BULK INSERT
非常適合一次性導入作業,但根據您的用例,您可能需要 SSMS 中的其他一些選項或使用 3rd 方。 這是一個詳細的指南,描述了將 CSV 文件導入 SQL Server 的各種選項,包括自動化(我的意思是安排)該過程以及為 CSV 位置指定 FTP 或文件存儲的方法。
將文件導入 Excel,首先打開 excel,然后轉到 DATA,從 TXT 文件導入,選擇將保留 0 前綴值的 csv 擴展名,並將該列保存為 TEXT 因為 excel 將刪除前導 0 否則(不要雙擊如果字段中有以 0 [零] 開頭的數字數據,則使用 Excel 打開)。 然后保存為制表符分隔的文本文件。 當您導入到 excel 時,您可以選擇另存為 GENERAL、TEXT 等。
BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)
我希望我可以使用 FORMAT 和 Fieldquote 功能,但在我的 SSMS 版本中似乎不支持
我知道有公認的答案,但我仍然想分享我的場景,也許可以幫助某人解決他們的問題工具
方案I被加載這是后來在視圖中顯示哪些是CSV格式的數據集我試圖使用大容量負載,但我是無法負荷BULK LOAD
使用
FIELDTERMINATOR = ','
並且 Excel 單元格也在使用,
但是,我也無法直接使用Flat file source
,因為我使用的是Code-First Approach
並且只在 SSMS DB 中制作模型,而不是在我稍后必須從中使用屬性的模型中.
解決方案
Add-Migration
可能是SSMS: How to import (Copy/Paste) data from excel可以提供幫助(如果您不想使用BULK INSERT
或沒有權限)。
如上所述,您需要添加 FORMAT 和 FIELDQUOTE 選項以將 .CSV 數據批量插入 SQL Server。 對於您的情況,SQL 語句將如下所示:
BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
FORMAT = 'CSV',
FIELDQUOTE = '""',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
)
盡管 SSMS 中的BULK INSERT
非常適合一次性導入作業,但根據您的用例,您可能需要 SSMS 中的其他一些選項或使用 3rd 方。 這是一個詳細的指南,描述了將 CSV 文件導入 SQL Server 的各種選項,包括自動化(我的意思是安排)該過程以及為 CSV 位置指定 FTP 或文件存儲的方法。
也許不完全是您要問的,但另一種選擇是使用Notepad++的CSV Lint 插件
該插件可以預先驗證 csv 數據,這意味着檢查錯誤數據,如缺少引號、不正確的小數分隔符、日期時間格式錯誤等。它可以將 csv 文件轉換為 SQL 插入腳本,而不是BULK INSERT
。
SQL 腳本將包含 1000 條記錄的每個 csv 行的INSERT
語句,並調整任何日期時間和十進制值。 該插件會自動檢測 csv 中的數據類型,並將包含一個CREATE TABLE
部分,其中包含每列的正確數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.