LINUX.ORG.RU

[Java]Парсим CSV файл.


1

1

Существует CSV файл с количеством строк ~10000000. С ним нужно уметь делать много чего интересного, но это уже другая история. Для начала его нужно провалидировать. Первая строка (заголовок) файла выглядить примерно так:

блабла String; а-ля_дата Date;ещё_блабла Float; целое_число Integer; бла-бла-бла Integer

Заголовок может быть любым, правило одно - для каждой колонки он состоит из двух слов: первое - имя столбца, второе - тип. Типов всего четыре: Integer, Float, Date (mm.dd.yyyy) и String. Реализовал проверку на совпадение количества записей во всех строках, на некорректную сигнатуру заголовка столбца и т.д. Осталось самое интересное - валидация типа записи в каждой ячейке. Ах да, если данные хоть в одной ячейке невалидны - аварийно падаем, что несомненно упрощает задачу. Вопрос - как бы лучше реализовать валидацию каждой ячейки, ибо объемы данных не так уж малы. В среднем у меня на данный момент на проверку кучи условий на объемах в 10 столбцов и 10000000 строк уходит ~5 сек, что уже, имхо, чертовски много.

Итак, знаем в каком столбце какого типа должны храниться данные и знаем строку, которая хранится в данной конкретной ячейке при проходе по всему файлу. Что меня спасет? Попытка создания wrapper класса из строки, хранящейся в ячейке и завершение работы по исключению? Регекспы? В общем, посоветуйте.

Спасибо.

Давно тут не был, тут кажется запилили касты. Тогда, обязательно кастую Zhbert и, обязательно, джавера vertexua.

Insomnium ★★★★ ()

Херня какаято а не csv.

так в чем сложность то ? Ты писать пробовал ? Вот когда напишешь валидатор, тогда и спрашивай _почему_ не работает. А то прямо культ дибилизма.

Джава - новый делфи! те тоже вечно искали компонентик что бы он за них все порешал и традиционно не начинали решать задачу до тех пор пока не убедятся что такого компонента нет.

Jetty ★★★★★ ()
Ответ на: комментарий от Jetty

Я лишь спросил что быстрее, хотя согласен, оба варианта реализовать - 2 минуты. Just for fun. Да, мусье, В последней строке у вас какая-то какая-то ерунда написана.

Insomnium ★★★★ ()

Делается 4 парсера валидатора на каждый тип, принимающих по строке.

Делается потоковый «токенайзер» строк (вообще есть встроенный, но кака), каждая строка сплтится по ';' но ни в коем случае не методом String.split (почему, можно узнать в исходниках).

по первой строке заполняется массив валидаторов. по остальным строкам, выдергивается валидатор по номеру столбца, если не парсится - то выбрасываем ошибку.

belous_k_a ()

ИМХО спасет тебя профайлер, ибо совершенно непонятно, что именно у тебя вызывает тормоза.

Могу предположить, что твое решение генерит слишком много мусора.

Macil ★★★★★ ()
Ответ на: комментарий от Insomnium

После упоминания режекспов для этой задачи, вас, милейший, уже ничего не спасет.

belous_k_a ()
Ответ на: комментарий от Jetty

традиционно не начинали решать задачу до тех пор пока не убедятся что такого компонента нет

и правильно. негоже творить велосипеды

wxw ★★★★★ ()
Ответ на: комментарий от wxw

Традицией было искать компонент не менее недели.... причем на любой чих :)

Jetty ★★★★★ ()

Хз, регекспы и свитч, не?

Zhbert ★★★★★ ()

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

Reset ★★★★★ ()

Регекспы?

Считаешь, сколько строк в файле, строишь один большой регэксп (правила то известны) и делаешь match на всё содержимое файла.

Вот.

А память нынче дешевая.

anonymous ()

Вручную разобрать заголовок, собрать из 4 заготовок регексп для всей строки и проверять на соответствие ему построчно.

Uter ()

Делаем методы для валидации значения каждого типа (они будут кидать исключение, если что-то не так):

String: пустой метод,

Integer: используем parseInt,

Float: используем parseFloat,

Date: сплитим по точке, применяем валидатор для инта и сравниваем длины.

Всё! Парсим заголовок, получаем массив типов, бежим по остальным строкам, сплитим и свичом определяем, какой валидатор надо применить.

Чисто интуитивно кажется, что должно быть быстрее регекспов, но надо проверить :)

Apple-ch ★★ ()

Валидация 100 миллионов значений за две секунды - вполне нормально.

no-dashi ★★★★★ ()

1. взять профайлер, найти узкое место.
2. проверить, можно ли оставаясь в рамках архитектуры приложения исправить узкое место.
3. если можно - переделать приложениy с учётом узкого места.
4. если нет - переделать архитектуру приложения с учётом узкого места.

nanoolinux ★★★★ ()

В среднем у меня на данный момент на проверку кучи условий на объемах в 10 столбцов и 10000000 строк уходит ~5 сек, что уже, имхо, чертовски много.

Есть какие-то более формальные требования к производительности, чем «имхо» ? По-моему отсюда надо начинать, или что, других задач нет?

roy ★★★★★ ()

Ну мы код не видели, потому тяжело сказать что не так. Примени профилировщик. Попробуй готовый парсер

vertexua ★★★★☆ ()

10000000 строк уходит ~5 сек

а должно быть ? 1 сек?

Karapuz ★★★★★ ()

Попробовать избавиться от боксинга, частого создания новых объектов, вызовов методов (особенно интерфейсных), если можно — сделать все методы статическими.

Но вообще 10 миллионов строк за 5 секунд — вполне прилично. Можно написать валидатор на Си, только вряд ли там это будет сильно быстрее.

note173 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.