programing

CSV 플랫 파일로 데이터를 내보내는 동안 포함된 텍스트 한정자 문제를 해결하는 방법은 무엇입니까?

showcode 2023. 6. 19. 21:48
반응형

CSV 플랫 파일로 데이터를 내보내는 동안 포함된 텍스트 한정자 문제를 해결하는 방법은 무엇입니까?

###RFC 4180:

RFC 4180은 을 정의합니다.의 요구 사항 중 하나는 아래와 같습니다.이것이 RFC 링크의 포인트입니다.

If double-quotes are used to enclose fields, then a double-quote
appearing inside a field must be escaped by preceding it with
another double quote.  For example:

"aaa","b""bb","ccc"

###SQL Server 2000:

DTS Export/Import Wizard RFC 4180 자체는 2005년 10월에 발표된 것으로 보이지만, in은 위에서 언급한 표준을 준수하는 것으로 보입니다.저는 아래 SQL Server 2000 버전을 사용하고 있습니다.

Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
May  3 2005 23:18:38 
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

###SQL Server 2012:

SQL Server Import and Export Wizard in은 RFC 4180에 정의된 표준에 따라 테이블에서 CSV 파일로 데이터를 내보내지 않습니다.저는 아래 SQL Server 2012 버전을 사용하고 있습니다.

Microsoft SQL Server 2012 - 11.0.2316.0 (X64) 
Apr  6 2012 03:20:55 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

###문제 시뮬레이션:

다음은 SQL Server 2000과 SQL Server 2012 모두에서 실행한 샘플입니다.아래 쿼리를 실행하여 테이블을 만들고 레코드를 몇 개 삽입했습니다.ItemDesc열에 이중 변수가 있는 데이터가 있습니다.내장 내보내기 데이터 마법사를 사용하여 두 SQL Server 버전의 데이터를 내보내고 생성된 CSV 파일을 비교하고자 합니다.

CREATE TABLE dbo.ItemInformation(
    ItemId nvarchar(20) NOT NULL,
    ItemDesc nvarchar(100) NOT NULL
) 
GO

INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100338754', 'Crown Bolt 3/8"-16 x 1" Stainless-Steel Hex Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202255836', 'Simpson Strong-Tie 5/8" SSTB Anchot Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100171631', 'Grip-Rite #11 x 1-1/2" Electro-Galvanized Steel Roofing Nails');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202210289', 'Crown Bolt 1/2" x 3" "Zinc-Plated" Universal Clevis Pin');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100136988', 'Tapcon 3/16" x 1-3/4" Climaseal Steel "Flat-Head" Phillips Concrete Anchors (75-Pack)');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('203722101', 'KwikTap 3/16" x 2-1/4" "Flat-Head" Concrete Screws (100-Pack)');
GO

에서 아래 설정을 사용하여 데이터를 CSV 파일로 내보냈습니다.나는 파일을 이름으로 저장했습니다.SQLServer2000_ItemInformation.csv.

DTS Export/Import Wizard

에서 아래 설정을 사용하여 데이터를 CSV 파일로 내보냈습니다.나는 파일을 이름으로 저장했습니다.SQLServer2012_ItemInformation.csv.

SQL Server Import and Export Wizard - Choose a destination

SQL Server Import and Export Wizard - Configure Flat File Destination

다음은 Beyond Compare를 사용하여 두 파일을 비교한 것입니다.에는 왼에는생파포있습다니함어에서 .SQL Server 2000에는 오쪽에생파포있습다니함에서 생성한 .SQL Server 2012의 왼쪽 파일을 볼 수 .SQL Server 2000에는 데이터 열에 포함된 따옴표를 보상하기 위한 추가 이중 따옴표가 포함되어 있습니다.이것은 다음에 명시된 표준을 준수합니다.RFC 4180하지만 그것은 분명히 에 의해 생성된 파일에서 누락되었습니다.SQL Server 2012

File Comparison

###웹에서 검색:

저는 웹에서 이 버그를 검색했고 다음 링크를 찾았습니다.다음은 Microsoft Connect에 대한 버그 보고서입니다.이러한 모든 문제는 파일 가져오기와 관련이 있지만 데이터 내보내기와는 관련이 없습니다.이 모든 버그는 다음과 같이 닫혔습니다.Fixed.

의 아래 에는 MSDN과 이 있다고 .Flat file source supports embedded qualifiers and a variable number of columns per row

MSDN 블로그의 또 다른 게시물은 섹션 아래에 동일하게 기술되어 있습니다.Embedded Qualifiers.

##제가 알고 있는 해결 방법:

내보낸 파일이 올바른 포함 한정자 데이터로 끝나도록 열 데이터의 모든 이중 "따옴표()를 두 개의 이중 ""따옴표()로 대체하는 쿼리를 작성하여 문제를 해결하는 방법을 알고 있습니다.이렇게 하면 데이터를 그대로 테이블에서 직접 꺼내는 것을 피할 수 있습니다.

###나의 질문:

  • 이 문제가 정말로 해결되었는지 모르겠습니다.SQL Server 2012이 문제는 텍스트 한정자가 포함된 파일과 CSV 데이터에 대해서만 해결되었습니까?

  • 아마도, 저는 분명히 잘못된 일을 하고 있고 명백한 것을 놓치고 있는 것 같습니다.제가 여기서 무엇을 잘못하고 있는지 누가 설명해 주시겠습니까?

###Microsoft 연결:

Microsoft Connect 웹 사이트에 버그 보고서를 제출하여 피드백을 받았습니다.여기 버그 보고서에 대한 링크가 있습니다.한다면, 해서 투표해 보세요.Microsoft Connect웹사이트

CSV로 내보내는 동안 포함된 텍스트 한정자가 RFC 4180을 준수하지 않음

저는 이 답변을 제공하지 않을 것입니다. 당신이 문서화를 위해 열심히 노력했고 한 달이 지나도 답변이 없는 상태로 투표되었습니다.자, 그럼 시작합니다.데이터를 변경하거나 도구를 변경하는 방법밖에 없는 것 같습니다.

아마도, 저는 분명히 잘못된 일을 하고 있고 명백한 것을 놓치고 있는 것 같습니다.제가 여기서 무엇을 잘못하고 있는지 누가 설명해 주시겠습니까?

툴이 고장났을 때 공급업체가 신경 쓰지 않을 때, 계속 시도하는 것은 실수입니다.바꿀 시간입니다.당신은 그것이 어떻게 고장났는지 정확히 조사하고 그것이 RFC 뿐만 아니라 도구 자체의 이전 버전을 위반한다는 것을 입증하기 위해 많은 노력을 기울였습니다.얼마나 더 많은 증거가 필요합니까?

CSV도 보트 앵커입니다.옵션이 있으면 구분된 일반 파일 형식을 사용하는 것이 좋습니다.많은 응용 프로그램의 경우 탭 구분이 좋습니다.영어 텍스트에는 해당 문자에 자리가 없기 때문에 IMO가 가장 적합한 구분 기호는 '\'입니다. (반면 Windows 경로 이름을 포함하는 데이터에서는 사용할 수 없습니다.)

CSV는 교환 형식으로 두 가지 문제가 있습니다.첫째, RFC가 어떤 말을 하든지 간에 애플리케이션마다 서로 다른 버전을 인식합니다.두 번째(그리고 관련)는 CS 용어로 정규 언어를 구성하지 않기 때문에 정규 표현으로 구문 분석할 수 없습니다.와 비교^([^\t]*\t)*[\t]*$탭으로 구분된 회선의 경우.CSV 정의의 복잡성의 실질적인 의미는 (위 참조) CSV를 처리할 도구가 상대적으로 부족하고 특히 심야 시간대에 호환되지 않는 경향이 있다는 것입니다.

옵션이 , 그중가 CSV "DTS"입니다.bcp.exeMicrosoft는 수년 동안 업데이트를 시도하지 않았기 때문에 매우 빠르고 안전합니다.저는 DTS에 대해 잘 모르지만, 자동화를 위해 사용해야 할 경우 IIRC에는 외부 유틸리티를 호출할 수 있는 방법이 있습니다.하지만 주의하세요, 그것은bcp.exe오류 상태를 신뢰할 수 있게 셸에 반환하지 않습니다.

DTS(디지털 스로틀 및 시프트)를 사용하고 CSV를 고수하기로 결정한 경우에는 데이터를 적절하게 준비하는 보기를 작성하는 것이 가장 좋은 방법입니다.는 그 코너로 를 들어 "DTS2012CSV라는 스키마를 , "DTS2012CSV "DTS2012CSV"라고 쓸 수 select * from DTS2012CSV.tablename관심 있는 사람에게 그것을 이해할 수 있는 싸움의 기회를 주는 것. (당신이 그것을 문서화할 것이기 때문에, 보기 텍스트의 주석으로?)필요한 경우 다른 사용자가 다른 손상된 추출물에 대한 기술을 복사할 수 있습니다.

HTH.

2년이 지난 계약이지만 SQL Server 2008을 계약에 사용해야 하기 때문에 이 문제가 발생했습니다(묻지마).이 질문을 읽은 후 교체 제안을 해야 한다는 것을 알았지만, 쿼리에서 이를 수행하러 갔을 때 잘라내기 문제가 발생했습니다. 쿼리 자체에서 replace() 함수를 사용하면 기본적으로 텍스트가 varchar(8000)로 변환되기 때문입니다.

그러나 DB Source 객체와 Flat File 객체 사이의 Derived Column 단계를 사용하여 동일한 작업을 수행할 수 있습니다.예를 들어, "short_description"이라는 이름의 열이 있는데, 이 열에는 따옴표가 있을 수 있으므로 다음 함수를 식으로 사용하고 파생 열에서 "Replace short_description"을 선택했습니다.

REPLACE(short_description,"\"","\"\"")

이것으로 문제가 해결된 것 같습니다.

종종 이름과 성은 동일한 필드에 있으며 형식이 지정되어 있습니다(성, 성).작업->데이터를 데이터베이스에서 바로 내보내기(추가 옵션이 있는 SSIS를 통해가 아님)를 사용하고 쉼표로 구분된 파일로 CSV로 내보내려면 텍스트 인증을 받아야 합니다.

이렇게 하면 이중 견적이 필요한 null이 아닌 선택된 필드에 도움이 됩니다.

CASE WHEN NOT PersonName IS NULL AND LEN(PersonName) > 0 THEN QUOTENAME(PersonName, '"') ELSE NULL END as 'PersonName'

결과:

사용자 이름

콜린스

언급URL : https://stackoverflow.com/questions/14815574/how-to-fix-the-embedded-text-qualifier-issue-while-exporting-data-to-csv-flat-fi

반응형