Это хороший вопрос.Проблема не была очевидна для меня, пока я не посмотрел на javadocs и не понял, что opencsv поддерживает только символ в качестве разделителя, а не строку ....
Вот пара предложенных работ-arounds (Примеры в Groovy можно преобразовать в java).
Игнорировать неявные промежуточные поля
Продолжать использовать OpenCSV, но игнорировать пустые поля.Очевидно, что это обман, но он будет хорошо работать для анализа данных с хорошим поведением.
CSVParser csv = new CSVParser((char)'|')
String[] result = csv.parseLine('J||Project report||"F, G, I"||1')
assert result[0] == "J"
assert result[2] == "Project report"
assert result[4] == "F, G, I"
assert result[6] == "1"
или
CSVParser csv = new CSVParser((char)'|')
String[] result = csv.parseLine('J|||Project report|||"F, G, I"|||1')
assert result[0] == "J"
assert result[3] == "Project report"
assert result[6] == "F, G, I"
assert result[9] == "1"
Сверните свой собственный
Используйте метод Java String tokenizer .
def result = 'J|||Project report|||"F, G, I"|||1'.tokenize('|||')
assert result[0] == "J"
assert result[1] == "Project report"
assert result[2] == "\"F, G, I\""
assert result[3] == "1"
Недостатком этого подхода является то, что вы теряете возможность игнорировать символы кавычек или экранирующие разделители.
Обновление
Вместо предварительной обработки данных, изменениеэто содержание, почему бы не объединить оба вышеперечисленных подхода в двухэтапном процессе:
- Используйте «свернуть свой собственный», чтобы сначала проверить данные.Разбейте каждую строку и докажите, что она содержит требуемое количество полей.
- Используйте подход "игнорирование полей" для анализа проверенных данных и убедитесь, что указано правильное количество полей.
Не очень эффективно, но, возможно, проще, чем написание собственного синтаксического анализатора CSV: -)