让 bcp.exe 转义终止符

Posted

技术标签:

【中文标题】让 bcp.exe 转义终止符【英文标题】:Getting bcp.exe to escape terminators 【发布时间】:2010-12-30 20:54:06 【问题描述】:

我需要使用 SQL Server 2000 的 BCP 实用程序导出一些数据。有时我的数据包含我需要用作列和行终止符的字符,例如 \t 和 \n。如何让 BCP 在输出数据时转义它用作终止符的字符,以便我可以在另一个程序中实际导入数据?

例如,我的列之一是文本数据,包括制表符和换行符。 BCP 只是按原样导出它们,而我尝试导入它们的程序会感到困惑,因为数据在一行的中间结束和/或一行包含额外的列而没有明显的原因。

这似乎是一个非常非常非常包含在数据导出器中的基本功能,但the command-line options 似乎没有提到它。 (为什么它不会只是默认值超出了我的范围。)我错过了什么吗?

【问题讨论】:

【参考方案1】:

您的数据不能包含带有制表符和换行符的制表符和换行符。这没有道理。转义无济于事,因为选项卡就是选项卡。我们不是在这里讨论 c# 字符串处理。

我会使用different terminators,例如|||/n,或者使用format file

【讨论】:

这确实有意义——例如,在 PostgreSQL 中使用 COPY FROM,它会将序列 \n 转换回文本列中的实际换行符。不幸的是,我无法在 PostgreSQL 中指定行分隔符。 另外,虽然不同的终止符是一种解决方法,但它需要 真的 很长时间来进行查询后替换。如果 BCP 能够正确地转义文本列,那就更好了。 osql 和 sqlcmd 都不支持这个。例如,如果您有一个以转义字符结尾的字段怎么办?如果您阅读 PostgreSQL 信息,它会提到狡猾的转义...... SQL Server 是完全可以预测的,不是吗? 好吧,它也必须转义转义字符。这就是转义字符的工作方式。包含换行符、反斜杠和制表符的文本字段将以\n\\\t 出现,并在导入时变回换行符、反斜杠和制表符。你能为狡猾的逃跑提供参考吗?我在 postgresql.org/docs/8.4/static/sql-copy.html 没有看到任何东西。 SQL Server 是可预测的,当然,但不是我(或 pgsql)正在寻找的输出。 在您的链接中:“...小心添加不必要的反斜杠,因为这可能会意外生成与数据结束标记匹配的字符串...”+ 3 个关于 CSV 模式的注释。 Sybase,与 SQL Server 相同:manuals.sybase.com/onlinebooks/group-as/asg1250e/util/…【参考方案2】:

我也遇到了同样的问题,找了很久才找到解决办法。 我从 BCP 大师那里找到了这个,听起来很合理。 也许你也想试试。

可能的解决方案:http://groups.google.co.uk/group/microsoft.public.sqlserver.tools/tree/browse_frm/thread/f1ee12cba3079189/ef9094123901fe26?rnum=1&q=lindawie+format+file&_done=%2Fgroup%2Fmicrosoft.public.sqlserver.tools%2Fbrowse_frm%2Fthread%2Ff1ee12cba3079189%2Fef9094123901fe26%3Ftvc%3D1%26q%3Dlindawie%2Bformat%2Bfile%26#doc_fa5708ca51d967a6

格式文件详细信息和设计: http://msdn.microsoft.com/en-us/library/aa173859%28SQL.80%29.aspx

一般来说,我可以建议这些链接让您了解 BCP 问题和解决方案: http://groups.google.co.uk/groups?q=lindawie+format+file

最好的问候

【讨论】:

链接已损坏,答案中未描述解决方案的详细信息【参考方案3】:

完全同意你的看法:转义应该是一种选择。 “你不能用制表符或换行符获取数据”是我听过的最愚蠢的事情。

这是一个可能的解决方案:

    使用 -r 选项设置不同的行终止符。东西 不太可能出现在您的数据中 (#!#$#%#)。我认为您可以使用多个 字符,这样就更容易了。 在功能强大的文本编辑器 sed 中打开您的数据文件,或编写脚本 - 并将任何 \n 和 \t 字符替换为它们的转义等效字符(\\n 和 \\t)。最后用 \n 替换你的行终止符,你应该很好。 我认为同样的事情应该适用于将 -t 用于字段终止符

看看this article for more information。

【讨论】:

【参考方案4】:

如果将多个字符放在双引号之间,则可以使用由多个字符组成的分隔符:

bcp MY_TABLE out C:\MY_FILE.txt -S SERVER_IP -d DB_NAME -U MY_USER -P MY_PASSWORD -w -t "&#)^@" -r ">~+!"

找到解决方案here。

【讨论】:

以上是关于让 bcp.exe 转义终止符的主要内容,如果未能解决你的问题,请参考以下文章

python转义字符及格式化字符串总结

万变不离核心基础第九关——转义符的使用/使转义符失效/保持字符串原始格式

html中让&不转义

转义字符有都哪些?

rime 配置 怎么写 yaml 转义符

javascript 怎么把字符串中的特殊符号转义