sql-server - bcp 文件有时带有双引号
问题描述
我有一个包含 2 列 ID、CompanyName 的 csv 文件。我想 bcp 到带有格式文件的 sqlserver 表。此文件以逗号分隔。.csv 文件的问题是 Companyname 只有在有多个单词时才会在它们周围加上双引号。
这是一个例子
CompanyID,CompanyName
1000,FirstCompanyName
2000,"Testing Comma Name"
我不知道如何为此编写格式文件。这是我尝试过的
10.0
3
1 SQLCHAR 0 10 ",\"" 1 CompanyID SQL_Latin1_General_CP1_CI_AI
2 SQLCHAR 0 0 "\"" 0 junk1 SQL_Latin1_General_CP1_CI_AI
3 SQLCHAR 0 100 "\r\n" 2 CompanyName SQL_Latin1_General_CP1_CI_AI
当我在命令提示符下键入时没有错误
bcp "[a].b.[CompanyData]" in "C:\test.csv" -f C:\Data.fmt -t, -F2 -S "server1\prod01" -Uuername -Ppwd -e C:\Logs\error.log -o C:\Logs\outputlog.log
没有错误,但表中也没有任何错误。
有人可以指导我吗?
谢谢先生
解决方案
bcp 命令行实用程序无法处理列具有零星双引号作为分隔符的 *.csv 文件。
一种可能的解决方案是将整行加载到临时表中的宽单列中。之后使用 T-SQL 通过 bcp 或BULK INSERT
.
这是第二部分。SQL Server 2017 起(由于增强SPLIT()
功能)
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (line_from_file NVARCHAR(MAX));
INSERT INTO @tbl (line_from_file) VALUES
(N'1000,FirstCompanyName'),
(N'2000,"Testing Comma Name"');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = ',';
;WITH rs AS
(
SELECT *
, TRY_CAST('<root><r><![CDATA[' +
REPLACE(line_from_file, @separator, ']]></r><r><![CDATA[') + ']]></r></root>' AS XML) AS xmldata
FROM @tbl
)
-- INSERT INTO targetTable (CompanyID, CompanyName)
SELECT c.value('(r[1]/text())[1]', 'INT') AS CompanyID
, TRIM('"' FROM c.value('(r[2]/text())[1]', 'NVARCHAR(100)')) AS CompanyName
FROM rs CROSS APPLY xmldata.nodes('/root') AS t(c);
输出
+-----------+--------------------+
| CompanyID | CompanyName |
+-----------+--------------------+
| 1000 | FirstCompanyName |
| 2000 | Testing Comma Name |
+-----------+--------------------+
推荐阅读
- rust - 如何将指向 C++ 函数中分配的数组的指针转换为 Rust 中的数组?
- ruby - Bug ruby csv 解析
- python - 有效的计数器来计算来自python中文本文件的错误输入尝试
- python - 在调用助手的函数中模拟子进程调用异常 - unittest mock 如何工作?
- google-cloud-platform - 云构建触发器不应基于 git commit 消息创建 docker 映像
- r - 根据条件删除列表组件
- python-3.x - 实现python数据模型层次结构
- vue.js - 在后端使用 AdonisJS 对 Vue-cli SPA 进行社交验证的最佳方式
- javascript - 在 JavaScript 中对 JSON 进行排序
- swagger - 如何覆盖 OpenAPI 中的示例以仅响应?