【问题标题】:file not having end line and " at first column and last column文件在第一列和最后一列没有结束行和 \"
【发布时间】:2023-01-10 02:25:40
【问题描述】:

我正在尝试通过在 Microsoft sql server 中使用 bcp 命令导出 csv 文件中的表。

下面是表格示例数据

Table name : XYZ
col1      col2      col3
abcd,inc. USD,inc   1234
pqrs,inc  USD,inc   6789
stuv,inc  USD,inc   0009

如上所述,列值中有逗号。

我写了如下的 .fmt 文件:

test.fmt

13.0 
3  
1 SQLCHAR 0 4000 "\",\"" 1  col1 SQL_Latin1_General_CP1_CI_AS 
2 SQLCHAR 0 4000 "\",\"" 2  col2 SQL_Latin1_General_CP1_CI_AS 
3 SQLCHAR 0 4000 "\r\n" 3   col3 SQL_Latin1_General_CP1_CI_AS

以下是我正在使用的命令:

DECLARE 
@V_BCP_QUERY VARCHAR(4000),
@V_BCP_OUTPUT_FILE VARCHAR(1500),
@V_BCP_FORMAT_FILE VARCHAR(1500),
@V_BCP_COMMAND VARCHAR(4000)
begin

SET @V_BCP_QUERY='"SELECT col1,col2,col3 FROM TABS..XYZ"'

SET @V_BCP_OUTPUT_FILE='"D:\OUTPUT.csv"'

SET @V_BCP_FORMAT_FILE='"D:\test.fmt"'

SET @V_BCP_COMMAND='bcp '+@V_BCP_QUERY+' queryout '+@V_BCP_OUTPUT_FILE+' -f '+@V_BCP_FORMAT_FILE+' -T -S "DEV-CR"'

EXECUTE Master.dbo.xp_CmdShell  @V_BCP_COMMAND

end

我在 OUTPUT.csv 文件中得到以下数据:

abcd,inc.","USD,inc","1234
pqrs,inc","USD,inc","6789
stuv,inc","USD,inc","0009

行首和行尾没有 "。 另外,当我在 excel 中打开它时,所有行都在一行中

我的要求是将文件导出到 csv 文件中。

请帮助

【问题讨论】:

  • 这是预期的,您将分隔符定义为 ",",并且分隔符不会出现在每行的开头或结尾。 bcp 不支持文本标识符,因此您最好使用支持的工具,或者使用数据中未出现的分隔符。例如,管道 (|) 可能是更好的选择。
  • 在我看来,您使用 xp_cmdshell 调用 bcp 然后调用 SQL Server 的事实更加“hacky”。使用实际的 ETL 工具,而不是您正在使用的方法。
  • 我需要在存储过程中添加这段代码 sn-p
  • 不要使用 bcp 实用程序。它不支持包含引号、逗号或换行符的分隔文件数据,尽管 RFC4180 已经存在 17 年了。如果您需要导出包含嵌入式引号、逗号或换行符的数据,请考虑使用外部工具,例如 PowerShell 的 Export-Csv cmdlet。
  • 听起来绝对像是一个 ETL 工具的案例,它可以上传数据,调用一个过程来生成所需格式的数据,然后使用该数据和出口它。 T-SQL 是这种端到端解决方案的错误工具。例如,作为 SQL Server 一部分的 SSIS 可以很容易地实现这一点。您可以使用数据流任务进行导入,然后使用另一个任务进行导出,其中导出使用生成数据集作为数据源的过程。

标签: sql-server csv bcp


【解决方案1】:

你们可以一起破解一个解决方案——但从长远来看,使用正确的工具来完成工作会更容易、更好。

不要使用 BCP 输出单独的列,而是创建一个格式化为您想要的结果的列:

SELECT quotename(concat_ws(',', quotename(col1, char(34)), quotename(col2, char(34)), quotename(col3, char(34)), char(34)) 
  FROM yourTable

这将在输出中为您提供一列 - 整个字符串周围有双引号,每列周围有双引号,并与“。”连接。分隔器。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2013-11-27
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多