Парсер CSV с поддержкой Unicode в Java

Я ищу Java-реализацию парсера CSV (значения, разделенные запятыми) с правильной обработкой данных Unicode, например. CSV-файлы UTF-8 с китайским текстом. Я полагаю, что такой синтаксический анализатор должен внутренне использовать методы, связанные с кодовой точкой, при повторении, сравнении и т. Д. Лицензия Apache 2 или аналогичная будет работать лучше всего.


person Igor Romanov    schedule 23.12.2009    source источник
comment
sourceforge.net/projects/javacsv попробуйте   -  person Bozho    schedule 23.12.2009
comment
Большинство парсеров CSV должны обрабатывать 16-битные символы. Вы говорите, что вам нужна поддержка 32-битных символов?   -  person Peter Lawrey    schedule 23.12.2009
comment
Я попробовал пару парсеров, в том числе один из другого проекта. Таким образом, кажется, что все они пытаются внутренне разделить поля путем итерации, используя 1) чтение строки 2) переход по строке с помощью charAt() и добавление к некоторому временному символу. У меня есть файлы UTF-8 с китайским текстом, некоторые символы закодированы 3 байтами, так что это не работает. Кажется, что даже запуск спецификации не обрабатывается правильно во многих парсерах.   -  person Igor Romanov    schedule 23.12.2009
comment
Правильная обработка UTF-8 не должна быть проблемой, если это настоящая UTF-8, потому что она уже обрабатывается Java (InputStreamReader с явной кодировкой), а не тем, о чем должен заботиться Parser. Вопрос довольно старый, может пора принять какой-то ответ?   -  person Danubian Sailor    schedule 01.09.2014


Ответы (3)


Я не верю в изобретение велосипеда. Так что я не хочу писать свой собственный синтаксический анализатор и мучиться с той же головной болью, что и кто-то другой.

Лично мне нравится анализатор CSV от Ostermiller. У них также есть репозиторий Maven, если интересно.


Вы также можете проверить OpenCSV. Существует вопрос о переполнении стека, касающийся синтаксического анализа юникода. .

person Ascalonian    schedule 23.12.2009
comment
Этот выглядит хорошо, и даже в нем прямо указано, что он поддерживает китайский язык, но я думаю, что его GPL — это то, что я не могу использовать в своей работе. - person Igor Romanov; 23.12.2009

Пробовали ли вы Commons CSV?

person Mirko N.    schedule 23.12.2009

Самому написать довольно легко. Откройте файл с помощью FileInputStream и InputStreamReader, использующих кодировку UTF-8. Оберните его в BufferedReader, который вы можете перебирать с помощью readLine(). Получить каждую строку как строку. Используйте регулярные выражения, чтобы разделить его на поля.

Единственная сложная часть заключается в построении регулярных выражений, чтобы они не рассматривали запятые, заключенные в кавычки, как разделители полей.

Приведенный выше подход немного неэффективен, но достаточно быстр для большинства приложений. Если у вас есть реальные требования к производительности, вам понадобится что-то, что перебирает символы. Я написал один несколько лет назад, который использует конечный автомат, который работал нормально.

person ccleve    schedule 23.12.2009
comment
Это проще, чем я могу себе позволить без кошмаров по ночам :-) Сейчас я ищу готовую к использованию библиотеку. - person Igor Romanov; 23.12.2009
comment
на самом деле это не просто. Простой случай можно обработать с помощью регулярных выражений, но когда вы попадаете в поля, которые сами содержат запятые или (необязательно) разделители кавычек, регулярное выражение не будет работать. Regex — прекрасный инструмент для определенных задач, но он не может заменить хорошо написанный синтаксический анализатор. - person Kevin Day; 24.12.2009
comment
Я думаю, что это сработает, просто будет немного сложнее. Google предоставляет хорошие регулярные выражения для мгновенного использования, см., например, здесь: programmersheaven.com/user/Jonathan/blog/ - person Igor Romanov; 24.12.2009