sql-server - 为什么 redshift 不接受我的固定宽度文本文件

标签 sql-server powershell sql-server-2008-r2 streamwriter

我正在从 SQL Server 2008 R2 数据库中读取 varchar(500) 列,以通过固定宽度的文本文件导入到 Redshift。

为了将记录下拉到一个固定宽度的文件中,我开始使用 StringBuilder 一次写出一个文本 block 。我使用 AppendFormat 和对齐说明符来对齐不同的记录。在某些时候,每 400k 行一次,我会将 StringBuilder 的内容写入 StreamWriter 以写入磁盘。

当我尝试将文件加载到 Redshift 时,我注意到文本存在问题,由于额外的列,上传到 Reshift 失败(列数超过了我的固定宽度规范所容纳的数量)。

当我针对常规字符串测试 StringBuilder 时,宽度与我希望它们匹配的宽度相匹配,即 500 个字符。

当我尝试将记录写入磁盘时出现了差异。当我使用 WriteLineformat StreamWriter 对象将上述数据库列写入磁盘时,我一直遇到同样的问题。

数据库的排序规则是 SQL_Latin1_General_CP1_CI_AS。我知道数据库中的字符串将数据库排序规则转换为 UTF-16。正如我上面执行的测试所述,我认为那里没有问题。我认为我遇到的问题是采用 UTF-16 格式的字符串并使用 StreamWriter 将它们写入磁盘。

除了换行符或回车符外,我可以期待数据库字段中的任何类型的字符。我非常有信心使用 TSQL 函数 LtrimRtrim 的组合在将空白插入数据库列之前对其进行修剪。

编辑:以下是我在 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 将多字节字符用于固定宽度的文件。

最佳答案

我怀疑问题是由 StreamWriter 引起的默认情况下使用 UTF-8,因此在某些情况下您会得到双字节字符,因为 utf-8 是可变宽度的。

尝试使用 unicode ,这将匹配您的数据库编码,StreamWriter有一个支持编码的重载。

关于sql-server - 为什么 redshift 不接受我的固定宽度文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861511/

相关文章:

sql-server - 如何在表格面板中动态显示数据

sql - Windows 身份验证 Windows 用户权限

sql - 将服务器名称设置为变量

c++ - Powershell ToBase64String 和 Linux base64 之间的不同输出

sql - 如何将SQL Server 2008 R2数据库从一台计算机复制到另一台计算机

sql - 为什么选择 Top 子句会导致长时间成本

sql-server - 在 Azure DevOps 管道上生成 SQL Server 架构更改脚本

PowerShell 重命名文件名并保留扩展名

带有标题到哈希表的 Powershell CSV

sql - 如何将此用于生成菜单层次结构的过程 SQL 代码转换为基于 SET 的方法?