Opencsv CsvMalformedLineException регистрирует всю ошибочную строку – могу ли я это предотвратить?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Opencsv CsvMalformedLineException регистрирует всю ошибочную строку – могу ли я это предотвратить?

Сообщение Anonymous »

Используя Opencsv (5.11), иногда мы получаем входные файлы с большим количеством строк (до 80 тыс. строк). Если при анализе одного из этих файлов возникает исключение CsvMalformedLineException (проблема «Незавершенное поле в кавычках в конце строки CSV»), исключение оборачивается RuntimeException с всю строкой, вызывающей нарушение, включенной в сообщение об исключении. При типичном протоколировании исключений это может привести к массивным сообщениям журнала.
Проблема такого рода ошибок в действительно большом файле заключается в том, что несовпадающий символ "" заставляет синтаксический анализатор думать, что весь остаток файла является частью одной и той же строки, поэтому все это содержимое попадает в сообщение об исключении (см. пример ниже).
Что интересно, так это то, что базовое сообщение об исключении Сообщение 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();
}
}

Незавершенный " в столбце 2–2 приводит к тому, что сообщение об исключении будет таким

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»