2016-04-14 61 views
1

我需要做的就是讀取一個.csv文件並將數據推送到數據庫中。我面臨的問題是該文件可能不遵循CSV格式,例如:「」「(在兩個雙引號內的單個雙引號),在這種情況下,apache camel拋出整個文件而不是該記錄。爲了解決這個問題,我決定分割文件並逐行解組,在使用這種方法時,現在我面臨另一個unicode字符在標記正文後沒有被保留的問題。是否有人面臨同樣的問題? 這裏是我的路線代碼片段:。分裂和Unicode字符的Apache駱駝文件解析問題

從(文件).split(體()令牌化( 「\ r \ n」))流()解組(DATAFORMAT).END()

我嘗試了幾件事來驗證我的理論,即修改身體正在破壞unicode字符。以下是路由th在我試過 1)from(file).to(file) - > Unicode字符被保留 2)from(file).split(body()).stream()。to(file) - > unicode character preserved 3)from(file).convertBodyto(String.class,「UTF-8」)。split(body())。streaming() - > Unicode字符丟失 4)from(file).split(body(String.clasS ))。streaming()。到(file) - > Unicode字符丟失。

我也驗證過我的JVM使用UTF-8進行編碼,我也嘗試將文件組件中的charset參數設置爲UTF-8,但沒有任何更改。

有人可以幫我解決這個問題嗎?

unicode字符§正在轉換爲反轉?

回答

0

你確定你的文件有UTF-8編碼嗎?你總是可以通過

<setProperty propertyName="Exchange.CHARSET_NAME"> 
     <constant>UTF-8</constant> 
</setProperty> 

執行交換編碼使用文件時,我通常設置交換編碼完全相同的文件是什麼,然後閱讀它,改變交換編碼回UTF-8之後。

讓我知道這是否有幫助。

R.

+0

我將路線更改爲以下路徑:from(file).setProperty(Exchange.CHARSET_NAME,constant(「UTF-8」))。convertBodyTo(String.class).split(body()。tokenize(「\ r \ n「))。streaming()。process()。end和unicode字符仍然被破壞 – Pri

+0

這就是爲什麼我認爲你的文件很可能不是用UTF-8編碼。有你嘗試過的其他編碼,如iso-8859-1?還要調試它,並在更改交換編碼時查看機體的外觀。 –

+0

「Zu¤iga」是我使用IS0-8859-1時看到的,使用UTF-8時的「Zu iga」 – Pri

0

只好與在UNIX中產生(通過駱駝),但仍然有不可打印的ASCII字符文件相同的問題。這導致了正在使用(流式傳輸)的分割問題。我使用了一個簡單的自定義分割器來編寫文件(文件大小爲幾百MB)。

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

寫入分離器很容易。我所要做的只是返回一個使用BufferedReader的迭代器,一次返回一行。