Проблема такого рода ошибок в действительно большом файле заключается в том, что несовпадающий символ "" заставляет синтаксический анализатор думать, что весь остаток файла является частью одной и той же строки, поэтому все это содержимое попадает в сообщение об исключении (см. пример ниже).
Что-то интересное заключается в том, что базовый код исключения Сообщение CsvMalformedLineException включает только начало текста оскорбительной строки, что на самом деле более желательно.
Есть ли простой способ запретить RuntimeException включать всю строку в свое сообщение?
Пример
Вот пример (содержимое строки остается небольшим для читаемость):
Код: Выделить всё
import java.io.StringReader;
import com.opencsv.bean.CsvToBeanBuilder;
public class QuotationsErrorTest {
public static class Data {
private String col1, col2, col3, col4;
}
public static void main(String[] args) {
String contents = """
col1, col2, col3, col4
Column 1-1 data,Column 1-2 data,Column 1-3 data,Column 1-4 data
Column 2-1 data,Column 2-2" data,Column 2-3 data,Column 2-4 data
Column 3-1 data,Column 3-2 data,Column 3-3 data,Column 3-4 data
Column 4-1 data,Column 4-2 data,Column 4-3 data,Column 4-4 data
Column 5-1 data,Column 5-2 data,Column 5-3 data,Column 5-4 data
Column 6-1 data,Column 6-2 data,Column 6-3 data,Column 6-4 data
""";
new CsvToBeanBuilder(new StringReader(contents))
.withType(Data.class)
.withSeparator(',')
.build()
.parse();
}
}
Код: Выделить всё
Exception in thread "main" java.lang.RuntimeException: Error parsing CSV line: 3, values: Column 2-2" data,Column 2-3 data,Column 2-4 data
Column 3-1 data,Column 3-2 data,Column 3-3 data,Column 3-4 data
Column 4-1 data,Column 4-2 data,Column 4-3 data,Column 4-4 data
Column 5-1 data,Column 5-2 data,Column 5-3 data,Column 5-4 data
Column 6-1 data,Column 6-2 data,Column 6-3 data,Column 6-4 data
Просматривая исходный код, я обнаружил, что класс LineExecutor — это то место, где CsvMalformedLineException обертывается, а для формулирования этого сообщения используется встроенный пакет ресурсов библиотеки, используя метод Контекст CsvMalformedLineException (который является оскорбительной «строкой»). Переопределить это не кажется тривиальным или даже возможным.
Я также рассматривал возможность перехвата RuntimeException, переобертывая вложенное исключение более коротким сообщением, но это кажется более чем хакерским, я ищу другой способ, более естественный для Opencsv.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -i-prevent
Мобильная версия