Nhập tệp CSV vào SQL Server


185

Tôi đang tìm kiếm trợ giúp để nhập .csvtệp vào SQL Server bằng cách sử dụng BULK INSERTvà tôi có một số câu hỏi cơ bản.

Các vấn đề:

  1. Dữ liệu tệp CSV có thể có ,(dấu phẩy) ở giữa (Ví dụ: mô tả), vậy làm cách nào để tôi có thể thực hiện nhập dữ liệu này?

  2. Nếu khách hàng tạo CSV từ Excel thì dữ liệu có dấu phẩy được đặt trong ""(dấu ngoặc kép) [như ví dụ bên dưới] vậy làm thế nào để nhập có thể xử lý việc này?

  3. Làm thế nào để chúng tôi theo dõi nếu một số hàng có dữ liệu xấu, nhập mà bỏ qua? (không nhập bỏ qua các hàng không thể nhập)

Đây là CSV mẫu có tiêu đề:

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.

Và câu lệnh SQL để nhập:

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
)

Có thể là SSMS: Cách nhập (Sao chép / Dán) dữ liệu từ excel có thể giúp ích (Nếu bạn không muốn sử dụng BULK NSERThoặc không có quyền cho nó).
Denis

Câu trả lời:


169

Nhập SQL Server CSV dựa trên

1) Dữ liệu tệp CSV có thể có ,(dấu phẩy) ở giữa (Ví dụ: mô tả), vậy làm cách nào để nhập dữ liệu xử lý các dữ liệu này?

Giải pháp

Nếu bạn đang sử dụng ,(dấu phẩy) làm dấu phân cách, thì không có cách nào để phân biệt giữa dấu phẩy là dấu kết thúc trường và dấu phẩy trong dữ liệu của bạn. Tôi sẽ sử dụng một khác nhau FIELDTERMINATORnhư ||. Mã sẽ trông như thế và điều này sẽ xử lý dấu phẩy và dấu gạch chéo đơn hoàn hảo.

2) Nếu khách hàng tạo csv từ excel thì dữ liệu có dấu phẩy được đặt trong " ... "(dấu ngoặc kép) [như ví dụ dưới đây] vậy làm thế nào để nhập có thể xử lý việc này?

Giải pháp

Nếu bạn đang sử dụng BULK insert thì không có cách nào để xử lý dấu ngoặc kép, dữ liệu sẽ được chèn với dấu ngoặc kép thành hàng. sau khi chèn dữ liệu vào bảng, bạn có thể thay thế các dấu ngoặc kép đó bằng ' '.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')

3) Làm thế nào để chúng tôi theo dõi nếu một số hàng có dữ liệu xấu, nhập mà bỏ qua? (nhập khẩu bỏ qua các hàng không thể nhập)?

Giải pháp

Để xử lý các hàng không được tải vào bảng do dữ liệu hoặc định dạng không hợp lệ, có thể được xử lý bằng thuộc tính ERRORFILE , chỉ định tên tệp lỗi, nó sẽ ghi các hàng có lỗi vào tệp lỗi. mã nên như thế nào

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
    )

1
Cảm ơn đã giúp đỡ. Reg Giải pháp số 1: Chúng ta có thể tạo | | tách giá trị tệp từ Excel? Bởi vì khoảng 20% ​​các tệp nguồn được tạo bởi Excel bởi máy khách.
Mitchhat

@Prabhat Làm thế nào bạn tải các tệp Excel vào SQL Server?
Vishwanath Dalvi

Đây không phải là các tệp Excel mà tôi đang tải. Máy khách đang sử dụng Excel để tạo tệp .CSV (cho 20% dữ liệu nguồn mà ứng dụng của chúng tôi nhập). Và tôi đã hỏi nếu chúng ta tạo các tệp csv bằng Excel thì làm sao chúng ta có | | làm dấu phân tách giá trị cột?
Mitchhat

Nếu bạn có ảnh hưởng đến cách ứng dụng khách tạo tệp CSV từ Excel, bạn có thể hướng dẫn họ cách đặt ký tự phân tách trong Excel (và, nó không còn là tệp được phân tách bằng "dấu phẩy" nữa, nó sẽ được tách ra (|), chẳng hạn. Với các vòng bạn nhảy qua vì điều này và nếu bạn có SSIS - tôi khuyên bạn nên kiểm tra nó. Các phiên bản của SQL Server 2012 trở lên có một nhà thiết kế SSIS rất mạnh mẽ (cũng trong VS 2012 trở lên) sẽ cho phép khách hàng của bạn chỉ cần gửi cho bạn các tệp excel thay vì csv.
qxotk

Tôi không chắc điều này hoàn toàn chính xác. Bạn có thể đối phó với dấu ngoặc kép trong Chèn hàng loạt SQL. Có một Stack Overflow về chủ đề này và người ta có thể sử dụng các tệp định dạng để dạy các bộ phân định hàng loạt khác nhau. stackoverflow.com/questions/25726385/... advancesharp.com/blog/1083/...
DtechNet

33

Trước tiên bạn cần tạo một bảng trong cơ sở dữ liệu của bạn, nơi bạn sẽ nhập tệp CSV. Sau khi bảng được tạo, hãy làm theo các bước dưới đây.

• Đăng nhập vào cơ sở dữ liệu của bạn bằng SQL Server Management Studio

• Nhấp chuột phải vào cơ sở dữ liệu của bạn và chọn Tasks -> Import Data...

• Nhấp vào Next >nút

• Đối với Nguồn dữ liệu, chọn Flat File Source. Sau đó sử dụng nút Duyệt để chọn tệp CSV. Dành thời gian để cấu hình cách bạn muốn nhập dữ liệu trước khi nhấp vào Next >nút.

• Đối với Đích, chọn nhà cung cấp cơ sở dữ liệu chính xác (ví dụ: đối với SQL Server 2012, bạn có thể sử dụng SQL Server Native Client 11.0). Nhập tên máy chủ. Kiểm tra Use SQL Server Authenticationnút radio. Nhập tên người dùng, mật khẩu và cơ sở dữ liệu trước khi nhấp vào Next >nút.

• Trên cửa sổ Chọn Bảng Nguồn và Chế độ xem, bạn có thể Chỉnh sửa Ánh xạ trước khi nhấp vào Next >nút.

• Chọn Run immediatelyhộp kiểm và bấm vào Next >nút.

• Bấm vào Finishnút để chạy gói.

Trên đây đã được tìm thấy trên trang web này (tôi đã sử dụng nó và thử nghiệm):


30
Sẽ thật tuyệt nếu bạn đã ghi công cho trang nơi bạn sao chép / dán câu trả lời này từ ...
SierraOscar

1
Không cần thiết phải tạo trước bảng, nó có thể được tạo trong quá trình nhập
bside 24/12/18

1
Tôi thích rằng bạn chỉ cần cắt và dán từ một trang web với dòng rất hữu ích "Dành thời gian để định cấu hình cách bạn muốn nhập dữ liệu" . Đó là tất cả mọi thứ tôi đang tìm kiếm: Tôi dường như không thể định cấu hình nó cả!
Auspex

Ồ, và "Kiểm tra nút radio Sử dụng SQL Server xác thực" là sai, vì bạn rất có thể muốn sử dụng Xác thực Windows. Đó là bất cứ điều gì làm việc cho bạn.
Auspex

cảm ơn đã tìm thấy quy trình từng bước với hình ảnh để thực hiện quy trình trên, đáng xem: qawithexperts.com/article/sql/iêu
user3559462

22

2) Nếu khách hàng tạo csv từ excel thì dữ liệu có dấu phẩy được đặt trong "..." (dấu ngoặc kép) [như ví dụ dưới đây] vậy làm thế nào để nhập có thể xử lý việc này?

Bạn nên sử dụng các tùy chọn 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
)

1
Lưu ý rằng công cụ xác định FORMAT chỉ khả dụng kể từ SQL Server 2017.
kristianp

13

Cách tốt nhất, nhanh nhất và dễ nhất để giải quyết dấu phẩy trong vấn đề dữ liệu là sử dụng Excel để lưu tệp được phân tách bằng dấu phẩy sau khi đặt cài đặt dấu tách danh sách của Windows thành một dấu phẩy khác (chẳng hạn như đường ống). Điều này sau đó sẽ tạo ra một tệp được phân tách bằng ống (hoặc bất cứ thứ gì) cho bạn mà sau đó bạn có thể nhập. Điều này được mô tả ở đây .


4

Firs bạn cần nhập tệp CSV vào Bảng dữ liệu

Sau đó, bạn có thể chèn hàng số lượng lớn bằng 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);
                }
            }
        }
    }
}

một trình bao bọc thân thiện với người dùng hơn có thể xung quanh các lớp BulkCopy busybulkcopy.codeplex.com
busytools

3

Đây là cách tôi sẽ giải quyết nó:

  1. Chỉ cần lưu tệp CSV của bạn dưới dạng Bảng XLS trong excel (Bằng cách đó, bạn sẽ không phải lo lắng về việc phân định. Định dạng bảng tính của Excel sẽ được đọc dưới dạng bảng và được nhập trực tiếp vào Bảng SQL)

  2. Nhập tệp bằng SSIS

  3. Viết Tập lệnh tùy chỉnh trong trình quản lý nhập để bỏ qua / sửa đổi dữ liệu bạn đang tìm kiếm (Hoặc chạy tập lệnh chính để xem xét kỹ lưỡng dữ liệu bạn muốn xóa)

Chúc may mắn.


3
Downvote: Nhập tệp XLS bằng SSIS là rất tệ. SSIS sẽ cố gắng đoán các kiểu dữ liệu của dữ liệu Excel, nhưng có thể đoán sai và bạn không thể làm gì về nó. Tốt hơn nhiều để sử dụng CSV.
NRzingh

Chà, tôi cũng đề nghị csv, nhưng nếu bạn đã đọc kịch bản của OP, anh ta có một số tình huống đặc biệt với các dấu phân cách không phải là vấn đề với các tờ xls. Thông thường các trường hợp đặc biệt như thế này không yêu cầu một giải pháp mở rộng, nhưng một bản sửa lỗi bảo tồn dữ liệu. Trong khi tải lên tệp, SSIS cho phép bạn chọn ánh xạ dữ liệu giữa các bảng nguồn và bảng đích một lần nữa, giúp giảm bớt nỗ lực liên quan. Đó là lý do tại sao phương pháp này được đề xuất là một cách nhanh chóng.
Zee

1
SSIS đã có thể xử lý các dấu phân cách văn bản CSV. Nếu bạn vẫn đang sử dụng SSIS, việc gặp rắc rối khi lưu CSV của bạn dưới dạng XLS trước tiên chỉ khiến tôi gặp phải sự cố vỡ tiềm năng mà không có lý do.
NRzingh

Ngoài ra, tôi thường xuyên có các tệp CSV quá lớn cho Excel.
Auspex

3

Vì họ không sử dụng trình hướng dẫn nhập SQL, nên các bước sẽ như sau:

nhập mô tả hình ảnh ở đây

  1. Nhấp chuột phải vào cơ sở dữ liệu trong các tác vụ tùy chọn để nhập dữ liệu,

  2. Khi trình hướng dẫn được mở, chúng tôi chọn loại dữ liệu sẽ được ngụ ý. Trong trường hợp này, nó sẽ là

Nguồn tập tin phẳng

Chúng tôi chọn tệp CSV, bạn có thể định cấu hình loại dữ liệu của các bảng trong CSV, nhưng tốt nhất là mang tệp đó từ CSV.

  1. Nhấn Next và chọn trong tùy chọn cuối cùng

Máy khách SQL

Tùy thuộc vào loại xác thực của chúng tôi, chúng tôi chọn nó, một khi điều này được thực hiện, một tùy chọn rất quan trọng xuất hiện.

  1. Chúng tôi có thể xác định id của bảng trong CSV (khuyến nghị rằng các cột của CSV phải được gọi giống như các trường trong bảng). Trong tùy chọn Chỉnh sửa ánh xạ, chúng ta có thể thấy bản xem trước của mỗi bảng với cột của bảng tính, nếu chúng ta muốn trình hướng dẫn chèn id theo mặc định, chúng ta bỏ chọn tùy chọn này.

Cho phép chèn id

(thường không bắt đầu từ 1), thay vào đó, nếu chúng tôi có một cột có id trong CSV, chúng tôi chọn chèn id cho phép, bước tiếp theo là kết thúc trình hướng dẫn, chúng tôi có thể xem xét các thay đổi tại đây.

Mặt khác, trong cửa sổ sau đây có thể có cảnh báo hoặc cảnh báo lý tưởng là bỏ qua điều này, chỉ khi chúng để lại lỗi là cần thiết phải chú ý.

Liên kết này có hình ảnh .


0

Nhập tệp vào Excel bằng cách mở excel trước, sau đó chuyển đến DATA, nhập từ Tệp TXT, chọn tiện ích mở rộng csv sẽ bảo toàn 0 giá trị tiền tố và lưu cột đó dưới dạng văn bản vì excel sẽ giảm 0 đầu (nếu không nhấp đúp để mở bằng Excel nếu bạn có dữ liệu số trong một trường bắt đầu bằng 0 [zero]). Sau đó, chỉ cần lưu ra dưới dạng tệp Văn bản được phân cách bằng Tab. Khi bạn đang nhập vào excel, bạn có một tùy chọn để lưu dưới dạng CHUNG, VĂN, v.v., chọn văn bản sao cho các trích dẫn ở giữa một chuỗi trong một trường như YourCompany, LLC cũng được giữ nguyên ...

BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR   = '\n'
)

Tôi ước tôi có thể sử dụng chức năng FORMAT và Fieldquote nhưng điều đó dường như không được hỗ trợ trong phiên bản SSMS của tôi


0

Tôi biết rằng đã có câu trả lời được chấp nhận nhưng tôi vẫn muốn chia sẻ kịch bản của mình có thể giúp ai đó giải quyết vấn đề CÔNG CỤ của họ

  • ASP.NET
  • TIẾNG VIỆT
  • SSMS
  • VƯỢT TRỘI

SCENARIO tôi đã tải tập dữ liệu ở định dạng CSV mà sau này được hiển thị trên Chế độ xem tôi đã cố gắng sử dụng tải số lượng lớn nhưng tôi không thể tải như BULK LOADđang sử dụng

FIELDTERMINATOR = ','

và tế bào Excel cũng đang sử dụng , , tuy nhiên, tôi cũng không thể sử dụng Flat file sourcetrực tiếp vì tôi đang sử dụng Code-First Approachvà thực hiện mô hình chỉ tạo trong SSMS DB, không phải trong mô hình mà tôi phải sử dụng các thuộc tính sau này.

GIẢI PHÁP

  1. Tôi đã sử dụng nguồn tệp phẳng và tạo bảng DB từ tệp CSV ( Nhấp chuột phải vào DB trong SSMS -> Nhập Flat FIle -> chọn đường dẫn CSV và thực hiện tất cả các cài đặt theo hướng dẫn )
  2. Tạo lớp người mẫu trong Visual Studio (Bạn PHẢI GIỮ tất cả các kiểu dữ liệu và tên giống như của tệp CSV được tải trong sql)
  3. sử dụng Add-Migration trong bảng điều khiển gói NuGet
  4. Cập nhật DB

0

Tôi biết đây không phải là giải pháp chính xác cho câu hỏi trên, nhưng đối với tôi, đó là một cơn ác mộng khi tôi đang cố gắng Sao chép dữ liệu từ một cơ sở dữ liệu được đặt tại một máy chủ riêng biệt sang địa phương của tôi.

Tôi đã cố gắng làm điều đó bằng cách xuất dữ liệu đầu tiên từ Máy chủ sang CSV/txtvà sau đó nhập bảng cục bộ của mình.

Cả hai giải pháp: với việc viết ra truy vấn để nhập CSVhoặc sử dụng trình hướng dẫn Nhập dữ liệu SSMS luôn tạo ra lỗi (lỗi rất chung chung, nói rằng có vấn đề phân tích cú pháp). Và mặc dù tôi không làm gì đặc biệt, chỉ cần xuất sang CSVvà sau đó cố gắng nhập CSV vào địa phươngDB , các lỗi vẫn luôn tồn tại.

Tôi đã cố gắng xem phần ánh xạ và xem trước dữ liệu, nhưng luôn có một mớ hỗn độn lớn. Và tôi biết vấn đề chính là đến từ một trong những tablecột chứa JSONSQL trình phân tích cú pháp đã xử lý sai.

Vì vậy, cuối cùng, tôi đã đưa ra một giải pháp khác và muốn chia sẻ nó trong trường hợp nếu người khác sẽ gặp vấn đề tương tự.


Những gì tôi đã làm là tôi đã sử dụng Trình hướng dẫn xuất khẩu trên Máy chủ bên ngoài.

Dưới đây là các bước để lặp lại quy trình tương tự:
1) Nhấp chuột phải vào cơ sở dữ liệu và chọnTasks -> Export Data...

2) Khi Thuật sĩ sẽ mở, chọn Tiếp theo và ở vị trí "Nguồn dữ liệu:" chọn "Máy khách gốc SQL Server".

nhập mô tả hình ảnh ở đây

Trong trường hợp Máy chủ bên ngoài, rất có thể bạn sẽ phải chọn "Sử dụng Xác thực Máy chủ SQL" cho "Chế độ xác thực:".

3) Sau khi nhấn Next , bạn phải chọn Destionation .
Đối với điều đó, chọn lại "SQL Server Native Client".
Lần này bạn có thể cung cấp địa phương của bạn (hoặc một số bên ngoài khác DB) DB.

nhập mô tả hình ảnh ở đây

4) Sau khi nhấn nút Tiếp theo, bạn có hai tùy chọn để sao chép toàn bộ bảng từ bảng này sang bảng DBkhác hoặc ghi lại truy vấn để chỉ định dữ liệu chính xác sẽ được sao chép. Trong trường hợp của tôi, tôi không cần toàn bộ bảng (nó quá lớn), nhưng chỉ là một phần của bảng, vì vậy tôi đã chọn "Viết truy vấn để chỉ định dữ liệu cần truyền".

nhập mô tả hình ảnh ở đây

Tôi sẽ đề nghị viết ra và kiểm tra truy vấn trên một trình soạn thảo truy vấn riêng trước khi chuyển sang Wizard.

5) Và cuối cùng, bạn cần chỉ định bảng đích nơi dữ liệu sẽ được chọn.

nhập mô tả hình ảnh ở đây

Tôi đề nghị để lại nó dưới dạng [dbo].[Query]hoặc một số Tabletên tùy chỉnh trong trường hợp nếu bạn gặp lỗi khi xuất dữ liệu hoặc nếu bạn không chắc chắn về dữ liệu và muốn phân tích thêm trước khi chuyển đến bảng chính xác mà bạn muốn.

Và bây giờ đi thẳng đến phần cuối của Wizard bằng cách nhấn các nút Next / Finish .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.