2016-04-14 10 views
1

私がする必要があるのは、.csvファイルを読み込んでデータをデータベースにプッシュすることだけです。私が直面している問題は、ファイルがCSV形式に従わないかもしれないということです。例えば、 "" "(2つの二重引用符で囲まれた単一の二重引用符)の場合、apache camelはその1つのレコードの代わりにファイル全体を破棄します。この問題を解決するために、私はファイルを分割し、行ごとに非整列化することにしました。このアプローチを使用すると、今はボディをトークン化した後にユニコード文字が保存されないという別の問題に直面しています。 。。ここではルートの私のコードスニペットです:.splitはアンマーシャリング(データ形式)(。トークン化( "\ r \ nの")体())(ファイル)から分割してUnicode文字でApacheのcamelファイルを解析する問題

ストリーミング().END()

私は体を修正することがユニコードのキャラクターを壊しているという私の理論を検証するためにいくつかのことを試みました。私はから 1)を試みた時に(ファイル).TO(ファイル) - > Unicode文字は()ストリーミング.split(身体()))ファイル(から) 2を保持されます(ファイル)へ - 。> Unicode文字は を保存しましたストリーミング() - >ユニコード文字が失われました 4)from(file).split(body(String.clasS) ))。)ストリーミング()。(ファイル) - > Unicode文字が失われました。

私も自分のJVMは、エンコーディングにUTF-8を使用していることを確認したと私はまた、UTF-8へのファイルコンポーネントにcharsetパラメータを設定しようとしましたが、何も変わっていません。

誰かがこの問題を解決するのに役立つことができますか?

ユニコード文字§が反転されていますか?

答えて

0

あなたのファイルには、UTF-8エンコーディングがありますか?あなたは、常にファイルを扱うとき、私は通常、バックUTF-8への交換エンコーディングを変更し、それを読んだ後、ファイルが正確に何を交換エンコーディングを設定

によって
<setProperty propertyName="Exchange.CHARSET_NAME"> 
     <constant>UTF-8</constant> 
</setProperty> 

を交換エンコーディングを強制することができます。

これが役立つかどうか教えてください。 R.

+0

私を次のように私のルートを変更:(ファイル)から.setProperty(Exchange.CHARSET_NAME、定数( "UTF-8"))convertBodyTo(String.class).split(身体()トークン化( "\ rを。 \ n "))。streaming()。process()。endそしてunicode文字はまだ壊れています – Pri

+0

その理由は、あなたのファイルがUTF-8でエンコードされていない可能性が高いからです。 iso-8859-1のような他のエンコーディングを試してみませんか?また、それをデバッグして、エクスチェンジエンコーディングを変更したときのボディの外観を確認してください。 –

+0

「Zu¤iga」は、IS0-8859-1、「Zu iga」を使用しているときにUTF-8を使用するときに表示されます。 – Pri

0

は(ラクダを通じて)UNIXで生成されたが、それでも非印字可能なASCII文字を持っていたファイルと同じ問題を持っていました。これは、使用していたスプリット(ストリーミング)に関する問題を引き起こしました。私は、ファイルをストリームするために必要なシンプルなカスタムスプリッタを作成しました(ファイルは数百MBのサイズでした)。

from("direct:process").split().method(FileSplitter.class, 
"split(${body})").shareUnitOfWork().streaming() 

スプリッタを書くのは簡単でした。私がしなければならなかったのは、BufferedReaderを使って一度に1行ずつ返すイテレータを返すことでした。

関連する問題