2016-05-27 5 views
1

私のアプリケーションでは、いくつかのイベントをログファイルに書き込んだ後、それらをredshiftに書き込みます。以下のファイルは3つのケースを示しています。あるケースでは、すべてが正常であり、パイプは使用されません。 2番目のユースケースにはパイプがありますが、うまくエスケープされています。しかし、3番目のケースは少しトリッキーです。 Event.x=Hi\|だから、エスケープするとHi\\|が生成され、Redshiftがこれをどのように解釈するのか分かりません。それはエスケープされたバックスラッシュとして解釈し、パイプを通常のデリミタ(悪い)と解釈しますか?またはb)パイプの前にバックスラッシュを見るだけで、パイプを引き離す(良い)?Redshiftのデリメータエスケープエッジケース

In my Java code ;Logfile Text ;Redshift columns  ;Works 
-------------------------------------------------------------- 
Event.x ;Event.y ;Logfile Text ;Column X ;Column Y ;Works 
-------------------------------------------------------------- 
Hi  ;10  ;Hi|10   ;Hi  ;10  ;Yes 
-------------------------------------------------------------- 
Hi|  ;10  ;Hi\||10  ;Hi|  ;10  ;Yes 
-------------------------------------------------------------- 
Hi\| ;10  ;Hi\\||10  ;???  ;???  ;??? 

ここに、現在の属性をエスケープして結合するコードを示します。 attributesList<String>であると仮定します。あなたは脱出を脱出し、パイプをエスケープする必要が

String log = attributes.stream() 
    .map(s -> s.replace("|", "\\|")) // Escape existing delimiters 
    .collect(Collectors.joining("|")); // Join on pipes 

答えて

1

"\|" -> "\\\|"

例えばredshift docsから

.map(s -> s.replace("\\", "\\\\")) // Escape escapes 
.map(s -> s.replace("|", "\\|")) // Escape existing delimiters 

COPYロード\ nはタブ文字として改行文字をロード\トンなど。 バックスラッシュをロードするには、バックスラッシュ(\)を使用してバックスラッシュをエスケープします。

+0

ああ、どのようなシンプルで良いソリューションですか。私は22時間で報奨金を授与します。 – michaelsnowden