J'essaie d'importer un file plat délimité par des tuyaux, avec un qualificateur de text à double citation, mais le file utilise une barre oblique inverse comme caractère d'échappement pour les guillemets doubles embeddeds. Alors une rangée pour la compagnie Toys "R" Us viendrait comme ça …
accountno|companyname|address1 1234|"Toys \"R\" Us"|"123 Main St."
L'assistant d'import de SQL 2012 reconnaît un guillemet double-double comme un guillemet double incorporé, mais il s'étouffe sur cette double barre oblique inverse. La réponse du fournisseur de données est "personne d'autre n'a un problème avec le format", donc je me request si c'est juste un paramètre d'option que j'ai manqué?
Avez-vous essayé d'utiliser un simple BULK INSERT
, download vos données dans une table de transfert en premier dans le server SQL en utilisant BULK INSERT quelque chose comme ….
Créer une table de transfert
CREATE TABLE UploadFile_Staging ( accountno INT , companyname VARCHAR (100) , address1 VARCHAR(100) ) GO
Insert en vrac
BULK INSERT UploadFile_Staging FROM N'D:\File_Folder\Data.txt' WITH (FIRSTROW = 2 ,FIELDTERMINATOR = '|' ,ROWTERMINATOR = '\n' ) GO
Une fois que vous avez des données dans la table du server sql, utilisez l'instruction de mise à jour suivante pour vous débarrasser des doubles guillemets du qualificateur de text et des caractères d'échappement.
Data Tidy Query
UPDATE UploadFile_Staging SET companyname = REPLACE(LEFT(STUFF(companyname,1,1,'') , LEN(companyname)- 2) , '\"', '"') ,address1 = REPLACE(LEFT(STUFF(address1,1,1,'') , LEN(address1)- 2) , '\"', '"')
Jeu de résultats
╔═══════════╦═════════════╦══════════════╗ ║ accountno ║ companyname ║ address1 ║ ╠═══════════╬═════════════╬══════════════╣ ║ 1234 ║ Toys "R" Us ║ 123 Main St. ║ ╚═══════════╩═════════════╩══════════════╝
BULK INSERT
peut être difficile avec la citation de champ, les séparateurs apparaissant dans datatables citées etc etc. Une alternative à la déblocage avec un file de format est de lancer le file avec un peu de powershell pour le nettoyer avant de l'insert comme @M. La réponse d'Ali. Ceci est juste une preference personnelle bien sûr, il y a plus d'une façon de le faire.
Par exemple:
Import-Csv -Delimiter '|' -Path $dirtyCsv | #Change the delimiter to suit ConvertTo-CSV -NoType -Delimiter '|' | #Pipe delims help with commas in quoted text ssortingngs %{ $_.Replace('"','') } | #Add other cleanup here Out-File $cleanCsv #Et Volia, one clean file
Un post de blog plus long (auto promo promo …) sur l'import de files csv sales: https://www.rednotebluenote.com/2015/12/public-holiday-csv-wrangling/