私のアプリケーションでは、いくつかのイベントをログファイルに書き込んだ後、それらを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 ;??? ;??? ;???
ここに、現在の属性をエスケープして結合するコードを示します。 attributes
がList<String>
であると仮定します。あなたは脱出を脱出し、パイプをエスケープする必要が
String log = attributes.stream()
.map(s -> s.replace("|", "\\|")) // Escape existing delimiters
.collect(Collectors.joining("|")); // Join on pipes
ああ、どのようなシンプルで良いソリューションですか。私は22時間で報奨金を授与します。 – michaelsnowden