barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 15 мая 2013 г.

Oracle: загрузка из csv

В поставку клиента Oracle входит утилита SQL Loader (sqlldr), предназначенная как раз таки для загрузки данных из внешних файлов. Подробно её использование описано тут: http://www.orafaq.com/wiki/SQL*Loader_FAQ. В т.ч. она умеет загружать данные в таблицы из scv. Для этого нужно создать управляющий файл примерно следующего содержания:
load data
 characterset utf8
 infile '/path/to/my.csv'
 into table table_name_to_import
 fields terminated by ","
 ( col1, col2, col3 )
Данный файл указывает путь к csv для загрузки, говорит о том, что содержимое файла закодировано с помощью UTF8 (без BOM), поля разделены запятыми, в каждой строке содержится 3 поля, которые должны быть загружены в таблицу "table_name_to_import" в колонки "col1", "col2" и "col3".
После этого можно вызывать sqlldr:
T:\app\username\product\11.2.0\client_1\BIN>sqlldr <username>@<alias>/<password> control=/путь/к/управляющему.файлу
В случае, если какие-то записи не были загружены (например, было превышено ограничение на длину поля), sqlldr рядом со входящим файлом создаст файл с расширением ".bad", в который будут помещены ошибочные записи из входящего csv.
В частности, при конфигурации, приведенной выше, в этот файл попадут все строки с пустыми полями, т.е. когда подряд идут два разделителя. Чтобы такие записи все же загружались (с установкой соотв. полей в NULL), нужно указать "trailing nullcols" в управляющем файле (после указания разделителя):
load data
 characterset utf8
 infile '/path/to/my.csv'
 into table table_name_to_import
 fields terminated by "," TRAILING NULLCOLS
 ( col1, col2, col3 )
Кстати, чтобы таблица, в которую осуществляется импорт, предварительно очищалась, можно воспользоваться командой "TRUNCATE", размещаемой перед "into":
load data
 characterset utf8
 infile '/path/to/my.csv'
 TRUNCATE into table table_name_to_import
 fields terminated by "," trailing nullcols
 ( col1, col2, col3 )

Комментариев нет:

Отправить комментарий