Задать вопрос
sxenguri
@sxenguri

Как правильно парсить данные из Excel файла?

Здравствуйте!
Заранее извиняюсь за не совсем ясное, как по мне, объяснение своей проблемы.
В вузе работаю над проектом, суть которого заключается в парсинге данных из Excel с последующем сохранением в PostgreSQL.
Мне дали таблицу, попросили написать для неё программу. Я написал, данные успешно парсились. Но затем мне скинули ещё с десяток таблиц, и вот тут начались проблемы. Таблицы несколько отличаются в том плане, что данные, которые в первой таблице находятся на n-ой строчке и j-ом столбце (1 скриншот), в других таблицах могут находиться в иных местах (2 скриншот).
Скриншоты

5ffe96f2ce1e8098016565.png
5ffe970b1b362024088238.png

И таких не совпадающих по координатам ячеек в таблицах достаточно много.
А я написал программу, которая начинает парсить данные с конкретного столбца и конкретной строчки конкретной таблицы, ибо предполагал, что таблицы по структуре будут одинаковы.

Вопрос: как грамотно написать парсер таким образом, чтобы он не был привязан к определенным строчкам и столбцам при поиске конкретных данных и, соответственно, не ломался, если нужные данные в таблице находятся, условно говоря, в ячейке C16, а не B16, как предполагалось. Как можно учесть все эти несоответствия?
Спрашиваю не потому, что сам не хочу напрягаться, а потому, что меня самого интересует, как можно написать такую "адаптивную" программу без костылей с кучей if-else и циклов for, и возможно ли такое в принципе.

Не знаю, нужна эта информация или нет, но:
1) Использую язык Java и библиотеку apache.poi.
2) Сам проект на GitHub
  • Вопрос задан
  • 3492 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
datka
@datka
Теоретически : Сходство этих документов в том что у них есть ячейка Протокол №, Начинаем искать эту ячейку с столбца А. Допустим ячейка А1, Если ячейка не пустая сравниваем ее со значением Протокол №, если не совпадают сравниваем дальше . А2 = Протокол №. Аn = Протокол №?. Не нашли в А столбце смотрите в В столбце.

Нашли протокол. Дальше делаете оффсет от протокола и по принципу если ячейка не пустая она должна равняться дате. Проверяем если значение является датой. тут либо стандартными средствами библиотеки если есть такая возможность, либо руками ( если в ячейке только чифры, если там 3 точки, слеши и т.д )
Ответ написан
Комментировать
@mystifier
Файл excel для импорта в базу должен иметь жестко оговоренный формат.
При загрузке нужно(насколько возможно) проверять соответствие.
Если найдено несоответствие - выдать ошибку и ничего не загружать.
Попытки поиска нужных данных в файлах несоответствующего формата часто заканчиваются кучей мусора в базе.
Ответ написан
Комментировать
@Korben5E
Для начала проверить , назначены ли имена ячейкам и если да - выдергивать значения по именам, а не по адресам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы