2017-01-05 53 views
0

Java POJOをStringに変換してAWS Kinesis Firehose Streamに公開することができました。Jackson-dataformat-csvライブラリの区切り文字をESCAPEする方法は?

私はこのconvertToString()を書いていたが、私は、区切り文字をエスケープする正しい方法を見つけることができませんよ。

public <T> List<String> convertToString(List<T> objectList, Class<T> tClass) { 

     List<String> stringList = new ArrayList<>(); 
     char delimiter = ','; 
     char escape = '\\'; 

     CsvMapper mapper = new CsvMapper(); 
     CsvSchema schema = mapper.schemaFor(tClass); 

     for (T object : objectList) { 
      try{ 
       stringList.add(mapper.writer(schema.withColumnSeparator(delimiter).withEscapeChar(escape)) 
         .writeValueAsString(object)); 
      } catch (JsonProcessingException e) { 
       System.out.println("Exception : " + e); 
      } 
     } 

     return stringList; 
} 

入力:スーパーヒーローフラッシュ=新しいスーパーヒーロー(1、 "フラッシュ"、 "バリー・アレン"、 "DC")。

予想される出力:1、フラッシュ、 "バリー・アレン" を、DC

誰かが何を指すことができます:私は取得しています1、フラッシュ、 "バリー\、アレン"、DC

出力私は間違っている?

答えて

1

あなたの出力は正しいです。オブジェクトまたは要素を二重引用符で囲むとそのまま出力されるため、 "Flash"は引用符なしに、 "Barry、Allen"は引用符で出力に書き込まれ、したがって、デリミタはすでにエスケープされており、バックスラッシュでエスケープする必要はありません。

EDIT/UPDATE

githubに付属のマニュアルを読んだ後、次の行は、発電機が唯一の二重引用符を使用して示しており、エスケープのみを解析に使用されます。

escapeChar(デフォルト:-1の意味「なし」):値がエスケープされる場合は、文字が使用されます。最も一般的にバックスラッシュ( '\')として定義されています。パーサーだけが使用します。ジェネレータは、引用符自体を示すために引用符を2倍にすることを含め、引用だけを使用します。

+0

私はフィールド値に私の区切り文字をエスケープするに興味があるので、それは単一のフィールドとしてカウントすることができます。これを達成する方法はありますか? – dushyantashu

+0

これは既に1つのフィールドとしてカウントされています。出力に "Barry、Allen"だけが二重引用符で囲まれている場合、これは単一フィールドであることを意味します。その出力を.csvファイルに保存してExcelで開き、結果を確認すると、 "Barry、Allen"は二重引用符を表示しない1つのフィールドになります。二重引用符で囲まれたフィールドを囲むと、エスケープする必要のある二重引用符以外の文字がエスケープされます。 –

+0

csvでは動作しますが、AWS Kinesisの区切り文字はRedshiftに公開するためにエスケープされます。このことを確認します。http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-copy-data-with-the-escape-option、私は回避策を探していました。 – dushyantashu

関連する問題