3

SQL Server 2008 R2 データベースから列を読み取っvarchar(500)て、固定幅のテキスト ファイルを介して Redshift にインポートしています。

レコードを固定幅のファイルにプルダウンするために、 を使用しStringBuilderて一度にテキストのブロックを書き出すことから始めました。AppendFormatさまざまなレコードを整列させるために、整列指定子を使用していました。特定の時点で、400k 行ごとに の内容StringBuilderStreamWriterディスクに書き込みます。

ファイルを 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()

もちろん、接続文字列やテーブルの命名規則の詳細については説明しません。

編集: データは 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 が固定幅のファイルにマルチバイト文字を使用することにあるようです。

4

2 に答える 2

3

この問題は、 StreamWriterがデフォルトで UTF-8 を使用しているため、utf-8 は可変幅であるため、場合によっては 2 バイト文字を取得することが原因であると思われます。

データベースのエンコーディングと一致するunicodeを使用してみてください。 StreamWriterには、エンコーディングをサポートするオーバーロードがあります。

于 2013-11-08T14:44:18.943 に答える
1

これを見た人が理解できるように。私の問題は本当に赤方偏移にあります。私が気づいたことの 1 つは、サービスが固定幅ファイルの処理に問題があるように見えることです。Redshift を実行する基盤となるシステムは ParAccel であるため、これは Amazon に固有のもののようです。過去に固定幅ファイルで問題がありました。S3 Copy コマンドの固定幅バージョン内で、Redshift がマルチバイト文字を受け入れることに問題があることを確認できました。

于 2013-11-14T02:36:01.730 に答える