[sql] CSV 파일을 SQL Server로 가져 오기

.csv사용하여 파일을 SQL Server로 가져 오는 데 도움이 필요하며 BULK INSERT기본적인 질문이 거의 없습니다.

이슈 :

  1. CSV 파일 데이터는 ,(예 : 설명) 사이에 쉼표 가있을 수 있으므로 이러한 데이터를 가져 오기 처리하려면 어떻게해야합니까?

  2. 클라이언트가 Excel에서 CSV를 생성하는 경우 쉼표가있는 데이터는 ""큰 따옴표로 묶습니다 (아래 예 참조). 그러면 가져 오기를 어떻게 처리 할 수 ​​있습니까?

  3. 일부 행에 잘못된 데이터가 있는지 추적하는 방법은 무엇입니까? (가져 오기는 가져올 수없는 행을 건너 뜁니다)

다음은 헤더가 포함 된 샘플 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 property를 사용하여 처리 할 수 ​​있고 오류 파일 이름을 지정하면 오류가있는 행을 오류 파일에 기록합니다. 코드는 다음과 같아야합니다.

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 파일을 가져와야하는 Fir

그런 다음 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);
                }
            }
        }
    }
}


답변

내가 해결하는 방법은 다음과 같습니다.

  1. CSV 파일을 Excel에서 XLS 시트로 저장하기 만하면 구분 기호에 대해 걱정할 필요가 없습니다. Excel의 스프레드 시트 형식은 테이블로 읽히고 SQL 테이블로 직접 가져옵니다.

  2. SSIS를 사용하여 파일 가져 오기

  3. 가져 오기 관리자에서 사용자 정의 스크립트를 작성하여 원하는 데이터를 생략 / 수정하십시오 (또는 제거하려는 데이터를 면밀히 조사하기 위해 마스터 스크립트를 실행하십시오).

행운을 빕니다.


답변

SQL 가져 오기 마법사를 사용하지 않기 때문에 단계는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

  1. 옵션 작업 에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하여 데이터 를 가져옵니다 .

  2. 마법사 가 열리면 암시 할 데이터 유형을 선택합니다. 이 경우에는

플랫 파일 소스

CSV 파일을 선택하면 CSV에서 테이블의 데이터 유형을 구성 할 수 있지만 CSV에서 가져 오는 것이 가장 좋습니다.

  1. 다음을 클릭하고 마지막 옵션을 선택하십시오

SQL 클라이언트

인증 유형에 따라 선택하면 매우 중요한 옵션이 제공됩니다.

  1. CSV에서 테이블의 ID를 정의 할 수 있습니다 (CSV의 열을 테이블의 필드와 동일하게 호출하는 것이 좋습니다). 매핑 편집 옵션에서 스프레드 시트의 열이있는 각 테이블의 미리보기를 볼 수 있습니다. 마법사가 기본적으로 id를 삽입하도록하려면 옵션을 선택하지 않은 상태로 둡니다.

ID 삽입 사용

(일반적으로 1에서 시작하지 않음) 대신 CSV에 ID가있는 열이 있으면 ID 삽입 사용을 선택하고 다음 단계는 마법사를 종료하는 것입니다. 여기에서 변경 사항을 검토 할 수 있습니다.

반면에, 다음과 같은 창에 경고 또는 경고가 나타날 수 있습니다 .주의를 기울여야하는 오류 가있는 경우에만이를 무시하는 것이 이상적입니다 .

이 링크에는 이미지가 있습니다 .