SSIS 2012 - 使用嵌入式反斜杠双引号导入平面文件

时间:2016-06-11 20:35:05

标签: sql-server ssis

我正在尝试使用双引号文本限定符导入管道分隔的平面文件,但该文件使用反斜杠作为嵌入式双引号的转义字符。因此 Toys“R”Us 这样的公司就会出现这样的情况 -

/var
    /www
        /myproject
            /app
            /src
            /bin
            /vendor
            /web
                app_dev.php

SQL 2012的导入向导将双引号识别为嵌入式双引号,但它在这个反斜杠双引号上窒息。数据提供者的回答是“没有其他人对格式有任何问题”,所以我想知道这是否只是一个我错过的选项设置?

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用简单的BULK INSERT,使用BULK INSERT将您的数据首先上传到saging server中的staging表....

创建临时表

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. ║
╚═══════════╩═════════════╩══════════════╝

答案 1 :(得分: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/