我正在使用bcp将数据从SQL查询导出到CSV文件,但是包含嵌入换行符,逗号,引号等的字段出现问题。
我有一个包含两列Id
和Name
的表。
我的bcp
命令如下:
bcp "select Id, Name from MyTable" queryout ./results.csv -c -t, -U SA -S localhost
生成的CSV文件如下所示:
1,Quick brown fox
2,The quick brown fox
jumps over the
lazy dog
3,This is a "quoted" value
4,Quick, Brown, Fox
有没有一种方法可以让bcp
自动引用字段,转义任何现有的引用等,以便生成的CSV文件实际上有效?
理想情况下,我希望csv文件看起来像这样:
"1","Quick brown fox"
"2","The quick brown fox
jumps over the
lazy dog"
"3","This is a \"quoted\" value"
"4","Quick, Brown, Fox"
答案 0 :(得分:0)
通常我在powershell中使用-replace格式化BCP的输出,如下所示,
[string]$rowStart=[System.Guid][System.Guid]::NewGuid()
[string]$fieldTerm=[System.Guid][System.Guid]::NewGuid()
[string]$rowTerm=[System.Guid][System.Guid]::NewGuid()
bcp "select format(Id, '$rowStart#'), Name from Test.dbo.MyTable" queryout "C:\temp\yourfile.txt" -c -T -t"$fieldTerm" -r"$rowTerm" -S"localhost"
$rowEndTerm='"' + $rowTerm
cat "C:\temp\yourfile.txt" `
| ForEach-Object { $_ -replace '"', '\"' } `
| ForEach-Object { $_ -replace $rowStart, '"'} `
| ForEach-Object { $_ -replace $fieldTerm, '","'} `
| ForEach-Object { $_ -replace "$rowTerm", $rowEndTerm} `
| ForEach-Object { $_ -replace $rowTerm, "`r`n"} `
> "C:\temp\results.csv"
答案 1 :(得分:0)
答案部分。
要引用字段,您需要使用格式文件来指定自定义字段终止符。 SO上已经有很多答案可以解决这个问题。
对于您数据中的crlfs ...看来BCP做了您想要的事情。它将它们打印出来,因为它们在数据中。听起来您想要清除的是那些数据,即使它们已包含在源表中。只需在查询中使用“替换”功能即可处理。摆脱“选择*”,并用所需列的完整选择替换,并在“名称”列上使用“替换”。