2017-03-18 6 views
0

많은 레코드가 포함 된 .csv 파일에서 데이터를 읽어야하지만 마지막 행의 에는 "the_end"문자열이 있고 그 뒤에는 LF 기호가 없습니다. 내 SQL 스크립트 아래SQL - 예기치 않은 EOF 오류가있는 CSV 파일을 읽습니다.

1,James,Smith,19750101 
2,Meggie,Smith,19790122 
3,Robert,Smith,20071101 
4,Alex,Smith,20040202 
the_end 

임시 테이블에 데이터를 읽습니다 :

create table #Data 
(
id int, 
first_name varchar(50), 
last_name varchar(50), 
birthdate smalldatetime 
) 


bulk insert #Data 
from 'C:\Users\Michał\Desktop\csvtest.csv' 
with 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 


select * from #Data 

drop table #Data 

오류는 다음과 같습니다

가 여기 내 CSV 파일입니다

메시지 4832, 수준 16, 상태 1, 줄 13
대량로드 : 예기치 않은 파일 끝이 데이터 파일에서 발견되었습니다.

메시지 7399, 수준 16, 상태 1, 줄 13
연결된 서버 "(null)"의 OLE DB 공급자 "BULK"에서 오류가 발생했습니다. 공급자가 오류에 대한 정보를 제공하지 않았습니다.

메시지 7330, 수준 16, 상태 2, 줄 13
연결된 서버 "(null)"의 OLE DB 공급자 "BULK"에서 행을 가져올 수 없습니다.

마지막 줄 레이블 "the_end"없이 내 테이블에 모든 데이터를 읽고 싶습니다. 어떻게 관리 할 수 ​​있습니까? 이 파일은 외부에서 제공 되었기 때문에 수정할 수 없으며 그렇게 할 수 없습니다.

+0

그것을 복사하고 수정? – Schwern

+0

무엇을 의미합니까? 테이블에 데이터 복사 및 무엇? –

+0

"*이 파일은 외부에서 제공 되었기 때문에 수정할 수 없으며 그렇게 할 수 없습니다. *"파일을 복사하십시오. 문제가되는 줄을 제거하십시오. 복사본을 가져옵니다. – Schwern

답변

2

사용 lastLine을위한 변수를 사용하여 lastrow option

bulk insert #Data 
from 'C:\Users\Michał\Desktop\csvtest.csv' 
with 
(
FIELDTERMINATOR = ',' 
, ROWTERMINATOR = '\n' 
, lastrow = 4 
) 

동적 SQL 예 : lastrow 옵션은 당신을 위해 작동하지 않는 경우

create table #Data (
    id int 
    , first_name varchar(50) 
    , last_name varchar(50) 
    , birthdate smalldatetime 
); 

declare @lastline int = 4; 

declare @sql nvarchar(max)= ' 
bulk insert #Data 
from ''C:\Users\Michał\Desktop\csvtest.csv'' 
with (
    FIELDTERMINATOR = '','' 
    , ROWTERMINATOR = ''\n'' 
    , lastrow = '+convert(nvarchar(11),@lastline)+' 
);'; 
exec sp_executesql @sql; 

select * from #Data 

drop table #Data 
+0

내 게시물을 읽었습니까? 나는 다른 파일을 가지고 있고 다른 줄에는 각각 파일 끝에 ... 4 또는 3333 또는 34 또는 22332 ... –

+0

@mike_pl 귀하의 게시물을 읽었습니다. 게시물에 여러 파일이 없거나 마지막 행이 어느 행인지 알 수 없습니다. – SqlZim

+0

그럼 이제 그걸 알 수 있습니다 :) –

0

, 수동으로 마지막 행을 삭제하고 다시 시도를 BulkLoad 프로세스를 실행하십시오. 모든 것이 잘 작동하면 VB.NET 실행 파일을 크레이트하여 파일을 열고 마지막 행을 제거한 다음 파일을 다시 저장하십시오. Windows 작업 스케줄러를 사용하여 delete-last-row 프로세스 및 BulkLoad 프로세스를 예약 할 수 있습니다.

https://www.sevenforums.com/tutorials/11949-elevated-program-shortcut-without-uac-prompt-create.html

관련 문제