我正在尝试使用双引号文本限定符导入管道分隔的平面文件,但该文件使用反斜杠作为嵌入式双引号的转义字符。因此 Toys“R”Us 这样的公司就会出现这样的情况 -
/var
/www
/myproject
/app
/src
/bin
/vendor
/web
app_dev.php
SQL 2012的导入向导将双引号识别为嵌入式双引号,但它在这个反斜杠双引号上窒息。数据提供者的回答是“没有其他人对格式有任何问题”,所以我想知道这是否只是一个我错过的选项设置?
答案 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/