让 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 转义终止符的主要内容,如果未能解决你的问题,请参考以下文章