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»