2016-03-07 6 views
0

У меня есть этот файл, который имеет непечатаемые символы (Я сохранил его в UTF-8 формате): https://dl.dropboxusercontent.com/u/110553980/mifile.txtКак импортировать файл с непечатаемыми символами с помощью SQLite?

Тогда я хотел бы загрузить его в БД SQLite этим способом (после этого наконечника I» ве найдено: Check the encoding of text in SQlite):

PRAGMA encoding = "UTF-8"; 

CREATE TABLE t (
NUMERO_REGISTRO INTEGER 
, RW_FECHA1 TEXT 
, RW_EMISOR1 TEXT 
, RW_IAMAT TEXT 
, RW_GRUPO TEXT 
, RW_NOMIAT TEXT 
, RW_GAASADES1 TEXT 
, RW_PAISDEST1 TEXT 
, RW_MARCA_ALTO_ING TEXT 
, RW_IBTACU_ACT TEXT 
, RW_IBACU_ACT TEXT 
, RW_IIBACU_ACT TEXT 
, RW_IINACU_ACT TEXT 
, RW_IBTACU_ANT TEXT 
, RW_IBACU_ANT TEXT 
, RW_IIBACU_ANT TEXT 
, RW_IINACU_ANT TEXT 
, RW_MARCA_CRECI TEXT 
, RW_MARCA_ACU TEXT 
, RW_DELE_EMI TEXT 
, RW_DISTRITO TEXT 
, RW_DIREMI TEXT 
, RW_POBEMI TEXT 
, RW_PROVINCIA TEXT 
, RW_DELEGACION_ACU TEXT 
, RW_DISTRITO_ACU TEXT 
, RW_ZONA_VENTA_ACU TEXT 
, RW_VENDEDOR_ACU TEXT 
, RW_CONTRATO TEXT 
, RW_NRO_SERIE TEXT 
, RW_OD_ACT TEXT 
, RW_OD_ANT TEXT 
, RW_OD_N1_ACT TEXT 
, RW_OD_N1_ANT TEXT 
, RW_OD_N2_ACT TEXT 
, RW_OD_N2_ANT TEXT 
, RW_JB TEXT 
, RW_CIA TEXT 
, RW_SPAM TEXT 
); 

.separator 'ww' 
.import /home/llami/mifile.txt TABLA 

Но она возвращает следующее, когда я запускаю его под RedHat Linux сервер:

$ sqlite3 dbname.db < /home/llami/loadit.sql 
Error: /home/llami/mifile.txt line 1: expected 39 columns of data but found 10 

Я думаю, becouse он не может читать специальные символы и как-то он интерпретирует их как конец записи.

Как я могу импортировать этот файл? Мне не нравится альтернатива добавления вставки в sql-скрипт, потому что реальный файл, который я хочу загрузить, имеет более 2000000 записей, поэтому производительность - очень важный момент.

+0

Sqlite3 не позволяет использовать многобайтовые входные разделители (по крайней мере, в последних версиях); однако код, похоже, не заботится о символах, отличных от ascii. Какую версию вы используете? – rici

+0

Я использую версию 3.6.20. Если один байтовый разделитель (и адаптируйте файл), у меня есть строка 1: ожидается 39 столбцов данных, но найдено 24. – harrison4

+0

Нулевой символ не допускается в текстовых значениях. '.import' не работает с произвольными двоичными данными. Почему для двоичных столбцов используется VARCHAR? –

ответ

1

Версия используемого sqlite3 (3.6.20, в соответствии с комментарием) не разрешает NUL байты в .import данных, поэтому каждая строка ввода заканчивается первым байтом NUL. С другой стороны, он принимает многосимвольные разделители.

Более поздние версии sqlite3 не позволяют использовать многосимвольные разделители, но, похоже, обрабатывают NUL байты. Однако поля TEXT, вероятно, не подходят контейнерам для строк, содержащих NUL байты; Я бы предложил использовать BLOB s.

Кстати, в 3.6.20, .import работает, создав команду INSERT INTO 'table' VALUES(...) и выполнив ее, поэтому с этой версией вы ничего не спасаете, используя объект .import. Было бы так же быстро создать команду INSERT и выполнить ее, и это будет иметь преимущество, позволяя вам делать все, что необходимо для точного создания данных.

Смежные вопросы