Возможности SuperCSV

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

e.g.

ABC|2|20130115150327|
1|1234567890123456|1234|20130109204710|21130109204710|
2|6543210987654321|1234|20130110043658|21130110043658|
1A345C7D

У меня есть несколько вопросов о возможностях SuperCSV в этой ситуации.

  • Позволяет ли он проверять разные строки по разным определениям, т. е. одну для записи заголовка и одну для записей данных?
  • Позволяет ли вам проверить, что разделитель (в данном случае вертикальная черта '|') должен быть добавлен в конец строки?
  • Есть ли или кто-нибудь написал CellProcessor, который проверяет шестнадцатеричные значения?

person Maugan Stevens    schedule 14.01.2013    source источник


Ответы (1)


  • Позволяет ли он проверять разные строки по разным определениям, т. е. одну для записи заголовка и одну для записей данных?

Да. Обычно вы читаете заголовок с помощью getHeader(), который не использует CellProcessors, но ничто не мешает вам просто прочитать заголовок как обычную строку с помощью read() с использованием CellProcessors. Каждый вызов read() позволяет вам передавать CellProcessors, поэтому вы можете обрабатывать/проверять заголовок, строки данных и контрольную сумму по-разному, используя 3 разных массива CellProcessor.

  • Позволяет ли вам проверить, что разделитель (в данном случае вертикальная черта '|') должен быть добавлен в конец строки?

Поскольку вы используете | в качестве разделителя, последний столбец будет рассматриваться как пустой столбец (null). Это означает, что ваш массив CellProcessor для чтения заголовка должен иметь 4 элемента (или 6 для строк данных), иначе вы получите исключение, говорящее о том, что количество столбцов не соответствует количеству процессоров ячеек. Поместив процессор new Equals(null) в конец, вы можете фактически подтвердить, что строка заканчивается на |.

  • Есть ли или кто-нибудь написал CellProcessor, который проверяет шестнадцатеричные значения?

Вы можете использовать существующий обработчик ячеек new StrRegex("[0-9A-F]+") для проверки с помощью регулярного выражения. Вы даже можете зарегистрировать удобочитаемое сообщение для ошибки проверки (например, «недопустимое шестнадцатеричное значение»), используя StrRegex.registerMessage().

Если вы хотите разобрать шестнадцатеричный код как число (вероятно, нет, но на всякий случай), то в Super CSV нет существующего ParseHex CellProcessor. Если вы напишете один и отправите патч, я включу его в предстоящий релиз! В зависимости от того, насколько велико число, возможно, лучше обновить ParseLong иметь еще один конструктор, который принимает систему счисления (в данном случае 16)?

Я рекомендую не усложнять задачу и использовать CsvListReader (вы можете используйте другие считыватели, но вам нужно определить массив nameMapping для предоставления имен столбцов для строк заголовка, данных и контрольной суммы) следующим образом:

  1. Прочитайте первую строку (я предполагаю, что второй столбец — это количество следующих строк данных?), используя массив «заголовок» CellProcessor.

  2. Считайте строки данных n раз (где n задается вторым столбцом заголовка), используя массив данных CellProcessor.

  3. Прочитайте контрольную сумму, используя массив CellProcessor 'checksum' (вероятно, только один ParseChecksum()).

person James Bassett    schedule 15.01.2013