Programing

CSV 파일을 SQL Server로 가져 오기

lottogame 2020. 5. 29. 07:52
반응형

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 insert를 사용하는 경우 큰 따옴표를 처리 할 수있는 방법이 없으며 데이터는 큰 따옴표와 함께 행에 삽입됩니다. 데이터를 테이블에 삽입 한 후 큰 따옴표를 ' '로 바꿀 수 있습니다.

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를 생성하는 경우 쉼표가있는 데이터는 "..."(큰 따옴표)로 묶습니다 (아래 예 참조). 그러면 가져 오기를 어떻게 처리 할 수 ​​있습니까?

You should use FORMAT = 'CSV', FIELDQUOTE = '"' options:

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
)

The best, quickest and easiest way to resolve the comma in data issue is to use Excel to save a comma separated file after having set Windows' list separator setting to something other than a comma (such as a pipe). This will then generate a pipe (or whatever) separated file for you that you can then import. This is described here.


Firs you need to import CSV file into Data Table

Then you can insert bulk rows using 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);
                }
            }
        }
    }
}

Here's how I would solve it:

  1. Just Save your CSV File as a XLS Sheet in excel(By Doing so, you wouldn't have to worry about delimitiers. Excel's spreadsheet format will be read as a table and imported directly into a SQL Table)

  2. Import the File Using SSIS

  3. Write a Custom Script in the import manager to omit/modify the data you're looking for.(Or run a master script to scrutinize the data you're looking to remove)

Good Luck.


Because they do not use the SQL import wizard, the steps would be as follows:

enter image description here

  1. Right click on the database in the option tasks to import data,

  2. Once the wizard is open, we select the type of data to be implied. In this case it would be the

Flat file source

We select the CSV file, you can configure the data type of the tables in the CSV, but it is best to bring it from the CSV.

  1. Click Next and select in the last option that is

SQL client

Depending on our type of authentication we select it, once this is done, a very important option comes.

  1. We can define the id of the table in the CSV (it is recommended that the columns of the CSV should be called the same as the fields in the table). In the option Edit Mappings we can see the preview of each table with the column of the spreadsheet, if we want the wizard to insert the id by default we leave the option unchecked.

Enable id insert

(usually not starting from 1), instead if we have a column with the id in the CSV we select the enable id insert, the next step is to end the wizard, we can review the changes here.

On the other hand, in the following window may come alerts, or warnings the ideal is to ignore this, only if they leave error is necessary to pay attention.

This link has images.


Import the file into Excel by first opening excel, then going to DATA, import from TXT File, choose the csv extension which will preserve 0 prefixed values, and save that column as TEXT because excel will drop the leading 0 otherwise (DO NOT double click to open with Excel if you have numeric data in a field starting with a 0 [zero]). Then just save out as a Tab Delimited Text file. When you are importing into excel you get an option to save as GENERAL, TEXT, etc.. choose TEXT so that quotes in the middle of a string in a field like YourCompany,LLC are preserved also...

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

I wish I could use the FORMAT and Fieldquote functionality but that does not appear to be supported in my version of SSMS

참고URL : https://stackoverflow.com/questions/15242757/import-csv-file-into-sql-server

반응형