SQL Server에서 부분적으로 따옴표로 따옴표로 묶은 CSV 파일 대량 삽입
정확하게 따옴표가 붙은 CSV 파일을 가져오려고 합니다. 데이터는 쉼표가 포함된 경우에만 따옴표가 붙여집니다. 예:
41, Terminator, Black
42, "Monsters, Inc.", Blue
첫번째 행이 올바르게 가져온다는 것이 관찰되지만 인용된 쉼표를 필드 구분자로 처리하는 방식으로 두번째 행 오류가 발생했습니다.
나는 이것과 같은 제안을 본적이 있습니다.
필드 터미네이터를 바꿉니다
필드 터미네이터='"","'
하지만 제 CSV 파일은 필요한 필드만 인용하기 때문에 그 제안이 효과가 있을 것 같지 않습니다.
SQL Server의 BULK IMPRATE 문이 올바르게 따옴표로 묶인 CSV 파일을 가져올 수 있습니까? 어떻게?
아쉽게도 SQL Server에서는 따옴표로 묶은 쉼표를 구분 기호로 해석합니다.이는 BCP 및 대량 삽입 모두에 적용됩니다.
출처: http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
데이터 내에서 터미네이터 문자가 발생하면 데이터가 아닌 터미네이터로 해석하고 해당 문자 뒤의 데이터는 다음 필드 또는 레코드에 속하는 것으로 해석합니다.따라서 터미네이터가 데이터에 나타나지 않도록 주의 깊게 선택해야 합니다.
이것이 오래된 주제라는 것을 알고 있지만 이 기능은 SQL Server 2017 이후로 구현되었습니다.찾으시는 매개 변수는 FIELDQ입니다.UOTE=(기본값은 '")입니다.https://learn.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017 에서 자세히 보기
이것에 대한 또 다른 해결책이 있습니다.
fmt 파일을 편집하여 따옴표를 필드 구분 기호의 일부로 간주합니다.
자세한 내용은 이 항목을 확인할 수 있습니다.
위 링크의 발췌:
따옴표를 제거하는 유일한 방법은 가져오기 작업 중에 지정된 열 구분 기호를 수정하는 것입니다.여기서 유일한 단점은 삽입할 데이터를 검사하면 열 구분 기호가 각 열마다 다르다는 것을 매우 빨리 깨닫게 된다는 것입니다(위에서 강조 표시된 구분 기호).
따라서 각 열에 다른 열 구분 기호를 지정하려면 대량 삽입 또는 BCP를 사용할 계획인 경우 형식 파일을 사용해야 합니다.위의 테이블 구조에 대한 형식 파일을 생성하면 다음과 같습니다.
9.0
3
1 SQLCHAR 0 5 "\t" 1 FName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "\t" 2 LName SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 50 "\r\n" 3 Company SQL_Latin1_General_CP1_CI_AS
각 열의 올바른 열 구분 기호를 나타내도록 형식 파일을 수정합니다.사용할 새 형식 파일은 다음과 같습니다.
9.0
4
1 SQLCHAR 0 0 "\"" 0 FIRST_QUOTE SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "\",\"" 1 FNAME SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 5 "\",\"" 2 LNAME SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 50 "\"\r\n" 3 COMPANY SQL_Latin1_General_CP1_CI_AS
Text 하고 Text Qualified로 합니다."
.
저도 이와 같은 문제가 있어서 SSIS 경로로 이동할 필요가 없었기 때문에 실행하기 쉽고 해당 필드에서 쉼표로 따옴표의 경우를 처리하는 PowerShell 스크립트를 찾았습니다.
PowerShell 스크립트의 소스 코드 및 DLL: https://github.com/billgraziano/CsvDataReader
다음은 사용법을 설명하는 블로그입니다. http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
이 하는 으로 된 에서 csv 하는 을 하는 에서 은 이 을 된 하는 FORMAT='CSV'
◦ 인용된 했습니다.일단 이것을 추가하면 부분적으로 인용된 파일로 예상대로 작동했습니다.
CSV 텍스트 파일 데이터 공급자와 함께 OpenRowSet을 사용하는 방법도 확인할 수 있습니다.
기능을 활성화해야 하지만 SQL Server >= 2005의 모든 버전에서 이 기능을 사용할 수 있습니다.
이 문제로 반나절을 보냈습니다.SQL Server Import & Export data 마법사를 사용하여 가져오는 것이 좋습니다.이 문제를 해결하는 설정이 마법사에 있습니다.자세한 스크린샷 : https://www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/ Thanks
저도 같은 문제가 있었는데, 가끔 텍스트를 두 배만 인용하는 데이터가 있었습니다.제 해결책은 BULK LOAD가 이중 견적을 가져오게 한 후 가져온 데이터에 REFACE를 실행하는 것입니다.
예를 들어,
"F:"에서 CodePoint_tbl을 대량으로 삽입합니다.\Data\Map\CodePoint열림\Data\CSV\ab.csv"(FIRSTROW = 1, FIELD TERMITER = ',', ROW TERMITER = '\n');
update CodePoint_tbl set Postcode = replace ('Postcode','') 여기서 charindex('','Postcode) > 0
REFRACE 스크립트를 작성하는 것이 고통스럽지 않게 하려면 다음과 같은 결과에서 필요한 것을 복사하여 붙여넣기만 하면 됩니다.
select C.ColID, C.[name] as Columnname into #Columns
from syscolumns C
join sysobjects T on C.id = T.id
where T.[name] = 'User_tbl'
order by 1;
declare @QUOTE char(1);
set @QUOTE = Char(39);
select 'Update User_tbl set '+ColumnName+'=replace('+ColumnName+','
+ @QUOTE + '"' + @QUOTE + ',' + @QUOTE + @QUOTE + ');
GO'
from #Columns
where ColID > 2
order by ColID;
저도 같은 문제가 있었지만, 다음과 같은 설정으로 효과가 있었습니다.
bulk insert schema.table
from '\\your\data\source.csv'
with (
datafiletype = 'char'
,format = 'CSV'
,firstrow = 2
,fieldterminator = '|'
,rowterminator = '\n'
,tablock
)
내 CSV-파일은 다음과 같습니다.
"col1"|"col2"
"val1"|"val2"
"val3"|"val4"
문제는 이전에 행 터미네이터를 '0x0a'로 설정했는데 작동이 안 된다는 것이었습니다.일단 '\n'로 바꾸자 작동하기 시작했습니다.
CSV 포맷 사양에 따라 데이터가 정확하게 인용되었는지 여부는 사양만 준수하면 상관없다고 생각합니다.과도한 견적은 제대로 구현된 경우 파서에서 처리해야 합니다.FIELDTERMINATOR
쉼표가 되어야 합니다.ROWTERMINATOR
is line end - 표준 CSV 파일을 나타냅니다.이 설정으로 데이터를 가져오려고 했습니까?
똑같이 쏘였어요 :)
이미 가져온 데이터를 정리하는 기능으로 이 로직을 랩핑했습니다.
DECLARE @str NVARCHAR(MAX);
DECLARE @quote_identifier NVARCHAR(MAX);
SET @quote_identifier = N'"';
SET @str = N'"quoted stuff"';
SELECT IIF(
LEFT(@str, 1) = @quote_identifier
AND RIGHT(@str, 1) = @quote_identifier,
SUBSTRING(@str, DATALENGTH(@quote_identifier), LEN(@str) - DATALENGTH(@quote_identifier)),
@str);
언급URL : https://stackoverflow.com/questions/12902110/bulk-insert-partially-quoted-csv-file-in-sql-server
'programing' 카테고리의 다른 글
페이지 로드 사이에 변수 지속 (0) | 2023.09.09 |
---|---|
symphony2 및 distrine을 사용하여 기존 데이터베이스에서 단일 개체 생성 (0) | 2023.09.09 |
PIL을 사용하여 RGBA PNG를 RGB로 변환 (0) | 2023.09.09 |
std:: 문자열을 사용한 printf? (0) | 2023.09.09 |
잠금 테이블을 수행할 때 원격 사용자의 액세스가 거부됨 (0) | 2023.09.09 |