Настольное приложение Java для загрузки файлов CSV в базу данных - PullRequest
1 голос
/ 11 октября 2011

Я работаю над настольным приложением (приложение типа Extract Transform Load), которое требует загрузки больших файлов CSV (около 6 ГБ) в базу данных, используя Java в качестве внешнего интерфейса и Oracle в качестве внутреннего, но я открыт для других базы данных и инструменты (например, SQLite, H2, HSQLDB, MySQL).

Я пытался использовать библиотеки Java OpenSource для анализа и загрузки CSV-файлов, таких как:

  1. OpenCSV
  2. Super CSV

Проблема с этими библиотеками заключается в эффективности. Они требуют слишком много времени для загрузки. Например, загрузка файла CSV 4 ГБ займет 6 часов.

Имея этот опыт, я решил попробовать утилиты базы данных для загрузки файлов CSV. Одним из них является Oracle SQL * Loader. Это быстрее и предлагает желаемый результат. Он может удалять пробелы, загружать файлы CSV в различные таблицы, использовать функции оракула, такие как декодирование и т. Д.

Однако у меня есть следующие проблемы:

  1. Я не смог найти способ получить ошибки / журналы SQL * в Loader и отобразить их пользователю.

  2. Поскольку, SQL * Loader является проприетарным, нет способа встроить его в установку моего приложения. Например, пользователю необходимо отдельно загрузить и установить клиент Oracle перед установкой моего приложения. Еще мне нужно проверить, установлен ли Oracle Client до начала процесса установки.

Я искал другие возможные решения и нашел безголовые базы данных, такие как SQLite и H2.

В SQLite я использую команду .import для загрузки файлов CSV. Но я не могу назвать это на Java.

Я обращаюсь к базе данных H2, но мне сложно загрузить ее, поскольку она не поддерживает экранирование строки заголовка.

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Если у вас есть оболочка bash, вы можете сделать это:

sqlite3 my_database_file <<< .import <(gawk 'NR>1 { a = $0; if(NR>2){print a;}}' my_csv_file) my_table_name
0 голосов
/ 13 октября 2011

Похоже, вы могли бы использовать CloverETL для этого.Это инструмент для интеграции данных на основе Java и ETL.Наряду с коммерческими выпусками у него есть бесплатный движок ETL с открытым исходным кодом .Это должно быть довольно легко внедрить в ваше приложение как библиотеку Java.У вас также не должно быть проблем с производительностью, о которых вы упоминали выше, если только узкое место не на стороне БД.CloverETL называется быстрым.

Если вам нужно узнать другие технические подробности, вы можете либо спросить меня, либо использовать CloverETL forum .

0 голосов
/ 11 октября 2011

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

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

Если файл примера, который вы разместили, является точным, вам придется сделать это в любом случае, так как SQLITE отклонит заключительную строку, содержащую только один столбец.Команда .import, приводящая к прерыванию всего ввода.

Если вы решаете проблему с нижним колонтитулом и настаиваете на использовании команд SQLITE, вот рекомендуемый метод:

Исправьте нижний колонтитул

HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2

Выполнить импорт

sqlite> select * from test;
HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2

Удалить нижний колонтитул

sqlite> select count() from test;
5
sqlite> delete from test where rowid=5;

Удалить верхний колонтитул

sqlite> delete from test where rowid=1;
sqlite> select * from test;
row1,row2,row3
row11,row22,row33
row111,row222,row33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...