我正在尋找具有適當處理Unicode數據的CSV(逗號分隔值)解析器的Java實現,例如,包含中文文本的UTF-8 CSV文件。我想這樣的解析器應該在迭代,比較等內部使用代碼點相關的方法。Apache 2許可證或類似的許可證會最好。Java中支持Unicode的CSV解析器
回答
寫起來很容易。使用FileInputStream和使用UTF-8的InputStreamReader打開文件。將它包裝在BufferedReader中,你可以使用readLine()來遍歷它。將每一行作爲一個字符串。使用正則表達式將其分割成字段。
唯一棘手的部分是構造正則表達式,因此它們不會將用引號括起來的逗號視爲字段分隔符。
上面的方法效率不高,但對大多數應用程序足夠快。如果你有真正的性能需求,那麼你需要通過字符迭代的東西。幾年前我寫了一篇使用可以正常工作的狀態機。
這比晚上我沒有噩夢的時候所能承受的更爲直接:-)我現在正在尋找可以隨時使用的圖書館。 – 2009-12-23 19:37:26
這實際上是*不直接。這個簡單的例子可以用正則表達式來處理,但是當你進入包含逗號或者(可選)引號的字段時,Regex將不起作用。對於某些工作來說,正則表達式是一個很好的工具,但它不能代替寫得很好的解析器。 – 2009-12-24 03:43:16
我認爲它會工作,只會更復雜一點。谷歌提供了很好的正則表達式使用,看到這裏例如:http://www.programmersheaven.com/user/Jonathan/blog/73-Splitting-CSV-with-regex/ – 2009-12-24 11:08:45
這一個看起來不錯,甚至直接聲明以支持中文,但我認爲它的GPL,這是我不能用於我的工作。 – 2009-12-23 19:51:31
你試過Commons CSV?
http://sourceforge.net/projects/javacsv/試試吧 – Bozho 2009-12-23 18:17:26
大多數CSV解析器都應該處理16位字符。你是否說你需要32位字符支持? – 2009-12-23 18:19:42
我嘗試了幾個解析器,其中包括一個來自其他項目的內部解析器。 所以看起來他們都嘗試在內部通過迭代使用1)讀取行2)使用charAt()進行遍歷,並追加到一些臨時字符。我有中文文本的UTF-8文件,有些符號用3個字節編碼,所以不起作用。看來即使在許多解析器中,啓動BOM也沒有正確處理。 – 2009-12-23 19:33:25