我正在从SQL Server 2008 R2数据库中读取varchar(500)
列,以通过固定宽度文本文件导入Redshift。
要将记录下拉到固定宽度的文件,我开始使用StringBuilder
一次写出一个文本块。我使用AppendFormat
和对齐说明符来对齐不同的记录。在某些点上,每隔400k行,我会将StringBuilder
的内容写入StreamWriter
以写入磁盘。
我注意到当我尝试将文件加载到Redshift时出现了文本问题,由于额外的列而导致上传到Reshift失败了(比我的固定宽度规范容纳了更多的列)。
当我针对常规字符串测试StringBuilder
时,宽度与我想要的匹配,500个字符。
当我尝试将记录写入磁盘时,出现了差异。当我使用WriteLineformat
StreamWriter
对象将上述数据库列写入磁盘时,我一直遇到同样的问题。
数据库的排序规则为SQL_Latin1_General_CP1_CI_AS
。我知道数据库中的字符串会将数据库排序规则转换为UTF-16。我认为那里没有问题,正如我上面进行的测试所述。我认为我遇到的问题是使用UTF-16格式的字符串并使用StreamWriter
将其写入磁盘。
我可以期待数据库字段中的任何类型的字符,除了换行符或回车符。我非常有信心在使用TSQL函数Ltrim
和Rtrim
的组合将数据空间推入数据库列之前修剪空格。
编辑:以下是我在Powershell中使用的代码
$dw = new-object System.Data.SqlClient.SqlConnection("<connection string details>")
$dw.open()
$reader = (new-object System.Data.SqlClient.Sqlcommand("select email from emails",$dw)).ExecuteReader()
$writer = new-object system.IO.StreamWriter("C:\Emails.txt",[System.Text.Encoding]::UTF8)
while($reader.read())
{
$writer.writelineformat("{0,-500}",$reader["email"])
}
$writer.close()
$reader.close()
显然,我不打算向你提供我的连接字符串或我的表命名约定的详细信息。
编辑:我正在撰写AWS Redshift文章,该文章解释了数据只能使用UTF-8编码导入Redshift。
http://docs.aws.amazon.com/redshift/latest/dg/t_preparing-input-data.html
编辑:我能够通过
获取输出文件的样本get-content -encoding utf8
文件内部的内容绝对是UTF-8。所有的行结尾。看起来我的主要问题是Redshift为固定宽度文件采用多字节字符。
答案 0 :(得分:3)
我怀疑这个问题是由StreamWriter默认使用UTF-8这一事实引起的,所以在某些情况下你会得到双字节字符,因为utf-8是可变宽度。
尝试使用与您的数据库编码匹配的unicode,StreamWriter具有支持编码的重载。
答案 1 :(得分:0)
只是为了让所有人都能理解这一点。我的问题是红移。我注意到的一件事是服务似乎有固定宽度文件的处理问题。这似乎是亚马逊特有的,因为运行Redshift的底层系统是ParAccel。我以前遇到过Fixedwidth文件的问题。我已经能够确认Redshift在S3 Copy命令的固定宽度版本中接受多字节字符存在问题。