CSV 파일을 SQL Server로 가져 오기


186

.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
)

SSMS 일 수 있음 : Excel에서 데이터를 가져 오는 방법 (복사 / 붙여 넣기) 이 도움이 될 수 있습니다 (사용 BULK NSERT하지 않거나 권한이없는 경우).
데니스

답변:


169

기반 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
    )

1
도와 주셔서 감사합니다. 솔루션 # 1 등록 : || Excel에서 분리 된 값 파일? 소스 파일의 약 20 %가 클라이언트에서 Excel을 사용하여 생성되기 때문입니다.
Prabhat

@Prabhat 어떻게 Excel 파일을 SQL Server에로드합니까?
Vishwanath Dalvi

이들은로드중인 Excel 파일이 아닙니다. 클라이언트는 Excel을 사용하여 .CSV 파일 (응용 프로그램에서 가져 오는 소스 데이터의 20 %)을 만듭니다. 그리고 Excel을 사용하여 csv 파일을 만들지 묻고 || 열 값 구분 기호로?
Prabhat

클라이언트가 Excel에서 CSV 파일을 만드는 방법에 영향을 미치는 경우 Excel에서 구분 기호 문자를 설정하는 방법을 가르쳐 줄 수 있습니다. 더 이상 "쉼표"로 구분 된 파일이 아니므로 파이프 (|)로 구분됩니다. SQL Server 2012 이상 버전에는 매우 강력한 SSIS 디자이너 (VS 2012 이상)도 있습니다. 클라이언트가 단순히 CSV 대신 엑셀 파일을 보내도록 허용
qxotk

이것이 완전히 정확한지 확실하지 않습니다. SQL 대량 삽입에서 큰 따옴표를 처리 할 수 ​​있습니다. 이 주제에는 스택 오버 플로우가 있으며 형식 파일을 사용하여 대량 삽입 가변 델리 미네 이터를 가르 칠 수 있습니다. stackoverflow.com/questions/25726385/… advancesharp.com/blog/1083/…
DtechNet

33

먼저 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버튼을 클릭 하여 패키지를 실행하십시오.

위는이 웹 사이트 에서 발견되었습니다 (사용하고 테스트했습니다).



1
이 가져 오기 프로세스 중에 생성 할 수 있습니다, 테이블을 미리 만들 필요가 없습니다
bside을

1
정말 유용한 라인 인 "데이터를 가져 오는 방법을 구성하는 데 시간을 보내십시오" 로 웹 페이지에서 잘라내어 붙여 넣기 만하면 됩니다. 그것이 내가 찾고있는 모든 것입니다 : 전혀 구성 할 수없는 것 같습니다!
Auspex

아, 그리고 "사용 SQL Server 인증 라디오 버튼을 선택" 당신이 아주 잘 Windows 인증을 사용할 수 있으므로 잘못된 것입니다. 어느 쪽이든 당신을 위해 일합니다.
Auspex

감사합니다 위의 절차를 구현하기위한 이미지가 포함 된 단계별 절차를 찾았습니다. qawithexperts.com/article/sql/…
user3559462

23

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
)

1
FORMAT 지정자는 SQL Server 2017 이후에만 사용할 수 있습니다.
kristianp

13

데이터 문제에서 쉼표를 해결하는 가장 빠르고 쉬운 방법은 Windows의 목록 구분 기호 설정을 쉼표 이외의 항목 (예 : 파이프)으로 설정 한 후 Excel을 사용하여 쉼표로 구분 된 파일을 저장하는 것입니다. 그러면 파이프 (또는 무엇이든)로 구분 된 파일이 생성되어 가져올 수 있습니다. 여기에 설명되어 있습니다 .


4

데이터 파일로 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);
                }
            }
        }
    }
}

BulkCopy 클래스 주위에 더 사용자 친화적 인 래퍼 busybulkcopy.codeplex.com
busytools

3

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

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

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

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

행운을 빕니다.


3
Downvote : SSIS를 사용하여 XLS 파일을 가져 오는 것은 끔찍합니다. SSIS는 Excel 데이터의 데이터 유형을 추측하려고 시도하지만 잘못 추측 할 수 있으며 수행 할 수있는 작업이 없습니다. CSV를 사용하는 것이 훨씬 좋습니다.
NReilingh

글쎄, csv도 제안하지만 OP의 시나리오를 읽은 경우 특히 xls 시트와 관련이없는 구분 기호가있는 특수 시나리오가 있습니다. 일반적으로 이와 같은 특수한 시나리오에는 광범위한 솔루션이 필요하지 않지만 데이터를 보존하는 수정이 필요합니다. 파일을 업로드하는 동안 SSIS를 사용하면 소스 테이블과 대상 테이블 간의 데이터 매핑을 다시 선택할 수있어 작업이 쉬워집니다. 이것이 바로이 방법이 빠른 해킹으로 제안 된 이유입니다.
Zee

1
SSIS는 이미 CSV 텍스트 구분 기호를 처리 할 수 ​​있습니다. 어쨌든 SSIS를 사용하는 경우 CSV를 XLS로 저장하는 데 어려움을 겪는다면 아무 이유없이 잠재적 인 파손을 추가하는 것으로 나타났습니다.
NReilingh

또한 일상적으로 CSV 파일이 Excel에 비해 너무 큽니다.
Auspex

3

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

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

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

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

플랫 파일 소스

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

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

SQL 클라이언트

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

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

ID 삽입 사용

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

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

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


0

먼저 Excel을 연 다음 DATA로 이동하여 TXT 파일에서 가져오고 0 접두사 값을 유지하는 csv 확장자를 선택하고 Excel에서 선행 0을 삭제하기 때문에 해당 열을 TEXT로 저장하십시오 (그렇지 않으면 두 번 클릭하지 마십시오) 0으로 시작하는 필드에 숫자 데이터가있는 경우 Excel에서 열어야합니다. 그런 다음 탭 구분 텍스트 파일로 저장하십시오. Excel로 가져올 때 GENERAL, TEXT 등으로 저장하는 옵션이 있습니다. YourCompany, LLC와 같은 필드에서 문자열 중간에 따옴표가 유지되도록 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 버전에서 지원되지 않는 것으로 보입니다.


0

내가 허용 대답이 있다는 것을 알고 있지만 아직, 어쩌면 도움이 누군가가 자신의 문제를 해결하기 위해 나의 시나리오를 공유 할 도구를

  • ASP.NET
  • EF 코드 우선 접근
  • SSMS
  • 뛰어나다

시나리오 본인은 대량로드를 사용하려고 이후였다보기에 표시하는 CSV 형식의 데이터 집합을로드했지만, 난은로드 할 수 없습니다이다 BULK LOAD사용되었다

FIELDTERMINATOR = ','

, 그러나 Excel 셀도 사용 했지만 나중에 속성을 사용해야하는 모델이 아닌 SSMS DB에서만 모델을 Flat file source사용 Code-First Approach하고 수행 했기 때문에 직접 사용할 수도 없었 습니다.

해결책

  1. 플랫 파일 소스를 사용하고 CSV 파일에서 DB 테이블을 만들었습니다 ( SSMS에서 DB를 마우스 오른쪽 버튼으로 클릭-> 플랫 파일 가져 오기-> CSV 경로 선택 및 지시대로 모든 설정을 수행하십시오) )
  2. Visual Studio에서 모델 클래스를 만들었습니다 (SQL에로드 된 CSV 파일의 모든 데이터 유형과 이름을 동일하게 유지해야합니다)
  3. 사용하다 Add-MigrationNuGet 패키지 콘솔에서
  4. DB 업데이트

0

나는 이것이 위의 질문에 대한 정확한 해결책이 아니라는 것을 알고 있지만, 복사 하려고 할 때 악몽이었다. , 별도의 서버에있는 하나의 데이터베이스에서 내 로컬로 데이터 .

먼저 서버에서 데이터를 내 보낸CSV/txt 다음 가져 오기 하여이 작업을 수행하려고했습니다. 내 로컬 테이블에.

두 가지 솔루션 : CSVSSMS 데이터 가져 오기 마법사를 사용하거나 가져 오기 위해 쿼리를 작성하면 항상 오류가 발생했습니다 (오류는 매우 일반적이며 구문 분석 문제가 있음). 내가 아무것도 특별한 일을하지 않았지만, 단지 수출CSV다음에 노력하고 수입 CSV 지역으로 DB, 오류가 항상 있었다.

매핑 섹션과 데이터 미리보기를 보려고했지만 항상 큰 혼란이있었습니다. 그리고 주요 문제 table는 포함되어 JSON있고 SQL파서가 잘못 처리 한 열 중 하나에서 발생 한다는 것을 알고 있습니다.

그래서 결국 다른 해결책을 찾았고 다른 사람이 비슷한 문제를 겪을 경우를 대비하여 공유하고 싶습니다.


내가 한 것은 내보내기 마법사를 사용했다는 것입니다. 것은 외부 서버 를 입니다.

동일한 프로세스를 반복하는 단계는 다음과 같습니다.
1) 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고Tasks -> Export Data...

2) 마법사가 열리면 다음을 선택하고 "데이터 원본 :"대신 "SQL Server Native Client"를 선택하십시오.

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

외부 서버의 경우 "인증 모드 :"에 대해 "SQL 서버 인증 사용"을 선택해야합니다.

3) 다음 을 누르면 Destionation 을 선택해야 합니다 .
이를 위해 "SQL Server Native Client"를 다시 선택하십시오.
이번에는 로컬 (또는 다른 외부 DB)을 제공 할 수 있습니다 DB.

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

4) 다음 단추를 누르면 전체 테이블을 한 테이블에서 DB다른 테이블로 복사 하거나 쿼리를 기록하여 복사 할 정확한 데이터를 지정하는 두 가지 옵션 이 있습니다. 필자의 경우 전체 테이블이 필요하지 않았지만 (표가 너무 큼) 그 중 일부만 "전송할 데이터를 지정하는 쿼리 작성"을 선택했습니다.

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

마법사로 이동하기 전에 별도의 쿼리 편집기에서 쿼리를 작성하고 테스트하는 것이 좋습니다.

5) 마지막으로 데이터를 선택할 대상 테이블을 지정해야합니다.

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

데이터를 내보내는 데 오류가 있거나 데이터에 대해 잘 모르고 원하는 정확한 테이블로 이동하기 전에 추가 분석을 원하는 경우에 대비 하여 [dbo].[Query]또는 사용자 지정 Table이름 으로 남겨 두는 것이 좋습니다 .

이제 다음 / 마침 버튼 을 눌러 마법사의 끝으로 바로 이동 하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.