2017-08-15 42 views
1

我正在通過BCP將製表符分隔的文本文件導入SQL Server 2012。除了不導入的文件的最後一行之外,它正在工作。這不是通常意外的EOF問題,其中分隔符設置不正確或逗號存在於使用逗號分隔符的數據中。字段分隔符顯式設置爲\t,行分隔符顯式設置爲\n。在Notepad ++中檢查最後一行時,它正確地包含數據和製表符。但是,它不具有行尾分隔符。相反,文件只是停留在最後一個製表符處(行的最後一個字段爲空)。據我所知,這是正常的。bcp拋出意外的EOF錯誤,除非該文件有額外的 n

奇怪的部分是,如果我添加一個行尾分隔符到文件末尾,最後一行正確導入。關於最後一行的唯一不尋常的事情是,第一個字段的數據在實際字符數據之前包含一個反引號。但反引號不能用作分隔符,因此似乎不太可能成爲問題,特別是當我添加一個「額外的」行尾分隔符時該行會導入。

那麼,分隔的文本文件應該總是在數據的末尾有一個行尾分隔符?還是有其他事情在這裏?

匿名的BCP代碼:

bcp DATABASENAME.dbo.tablename in "L:\directoryname\filename.txt" -c -S servername -U username -P passwordtext -F 2 -t \t -r \n 
+0

** 1 **是,** 2 **編號 –

回答

2

由於@TT注意,你已經sussed問題。 一個補丁修復可能是使用PowerShell來確保有該文件關閉CR/LF:

powershell "Get-Content -Path .\original.tsv | Set-Content -Path .\corrected.tsv;" 

如果有一個,它仍然在那裏,沒有新的一個將被添加。 如果丟失,它將被添加。

然後修改您的BCP行以使用更正後的文件名作爲輸入,並在正常後自行清理。

+0

powershell命令在文件末尾添加換行符? –

+0

簡答:是的。這是一種副作用。 'Get-Content'讀取文件,並且讀取最後一行,即使它沒有換行符。 'Set-Content'寫入一個新文件,並在每行寫入後確保換行。埃爾戈,如果以前沒有一個,現在是;如果之前有一個......它仍然存在,並且沒有添加新的。 –

+0

很高興知道! –