2016-06-11 58 views
2

我想導入一個平面文件的管道分隔符,雙引號文本限定符,但該文件使用反斜槓作爲嵌入式雙引號的轉義字符。因此,對於公司一排玩具「反」鬥會來像這個 -SSIS 2012-導入嵌入式反斜槓的平面文件雙引號

accountno|companyname|address1 
1234|"Toys \"R\" Us"|"123 Main St." 

SQL 2012的導入嚮導識別兩雙引號作爲嵌入式雙引號,但它扼流圈這個反斜線雙引用。數據提供者的回答是「沒有其他人對格式有問題」,所以我想知道這是否僅僅是我錯過的選項設置?

回答

0

您是否嘗試過用一個簡單的BULK INSERT,上傳數據到一個臨時表中首先使用BULK INSERT像到SQL Server ....

創建臨時表

CREATE TABLE UploadFile_Staging 
         (accountno INT 
         , companyname VARCHAR (100) 
         , address1 VARCHAR(100) 
         ) 
GO 

散裝插入

BULK INSERT UploadFile_Staging 
FROM N'D:\File_Folder\Data.txt' 
WITH (FIRSTROW = 2 
    ,FIELDTERMINATOR = '|' 
    ,ROWTERMINATOR = '\n' 
    ) 
GO 

一旦你有數據在sql server表中使用下面的更新語句來擺脫文本限定符的雙引號和轉義字符。

數據整潔查詢

UPDATE UploadFile_Staging 
SET companyname = REPLACE(LEFT(STUFF(companyname,1,1,'') , LEN(companyname)- 2) , '\"', '"') 
    ,address1 = REPLACE(LEFT(STUFF(address1,1,1,'') , LEN(address1)- 2) , '\"', '"') 

結果集

╔═══════════╦═════════════╦══════════════╗ 
║ accountno ║ companyname ║ address1 ║ 
╠═══════════╬═════════════╬══════════════╣ 
║  1234 ║ Toys "R" Us ║ 123 Main St. ║ 
╚═══════════╩═════════════╩══════════════╝ 
0

BULK INSERT可以挑剔與字段引用,分離器出現在報價數據等等來擺弄與另一種format file它是通過一些PowerShell運行文件來清理它之前根據@ M.Ali的答案BULK INSERT。這當然只是個人喜好,有多種方式可以做到。

例如:

Import-Csv -Delimiter '|' -Path $dirtyCsv | #Change the delimiter to suit 
    ConvertTo-CSV -NoType -Delimiter '|' |  #Pipe delims help with commas in quoted text strings 
    %{ $_.Replace('"','') } |      #Add other cleanup here 
    Out-File $cleanCsv        #Et Volia, one clean file 

更長的(自我促銷通知......)的博客文章對進口髒CSV文件:https://www.rednotebluenote.com/2015/12/public-holiday-csv-wrangling/