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()
もちろん、接続文字列やテーブルの命名規則の詳細については説明しません。
編集: データは UTF-8 エンコーディングを使用してのみ Redshift にインポートできることを説明する AWS Redshift の記事を含めています。
http://docs.aws.amazon.com/redshift/latest/dg/t_preparing-input-data.html
編集:出力されたファイルのサンプルを取得できました
get-content -encoding utf8
ファイル内のコンテンツは間違いなく UTF-8 です。内のすべての行末。私の主な問題は、Redshift が固定幅のファイルにマルチバイト文字を使用することにあるようです。