2013-09-23 2 views
1

У меня есть список синонимов в формате csv файла: word,meaning1,meaning2,meaning3....Импорта переменного числа столбцов в SQLite базы данных

Различные слова имеют разное количество синонимов, что означает, что строки могут иметь переменное число столбцов. Я пытаюсь импортировать файл CSV в SQLite базу данных следующим образом:

sqlite3 synonyms 
    sqlite> create table list(word text, meaning0 text, meaning1 text, meaning2 text, meaning3 text, meaning4 text, meaning5 text, meaning6 text, meaning7 text, meaning8 text, meaning9 text); 
sqlite> .mode list 
sqlite> .separator , 
sqlite> .import ./csv/synonyms.csv list 

Чтобы быть на безопасной стороне, я предположил, макс. количество 10 столбцов на каждое слово. Для этих слов с менее чем 10 синонимами, остальные столбцы должны быть null. Я получаю ошибку на выполнение команды import является:

Error: ./csv/synonyms.csv line 1: expected 11 columns of data but found 3 

Мой вопрос (ы):
1. В случае, если число столбцов меньше, чем 10, как я могу сказать SQLite, чтобы заменить его null?
2. Есть ли способ указать, что я хочу 10 столбцов после слова вместо автоматического ввода?

ответ

2

Вы можете сделать следующее:

  • Импортировать все данные в один столбец;
  • Обновить таблицу, разделяющую содержимое столбца в другие столбцы.

Пример:

-- Create a table with only one column; 
CREATE TABLE table_name(first); 
-- Choose a separator which doesn't exist within file 
.separator ~ 
-- Import data 
.import file.csv table_name 

-- Add another column to split data 
ALTER TABLE table_name ADD COLUMN second; 
-- Split data between first and second column 
UPDATE table_name SET first=SUBSTR(first, 1, INSTR(first, ",")-1), second=SUBSTR(first, INSTR(first, ",")+1) WHERE INSTR(first, ",")>0; 

-- Repeat to next column 
ALTER TABLE table_name ADD COLUMN third; 
-- Split data between second and third column 
UPDATE table_name SET second=SUBSTR(second, 1, INSTR(second, ",")-1), third=SUBSTR(second, INSTR(second, ",")+1) WHERE INSTR(second, ",")>0; 

-- And so on... 
ALTER TABLE table_name ADD COLUMN fourth; 
UPDATE table_name SET third=SUBSTR(third, 1, INSTR(third, ",")-1), fourth=SUBSTR(third, INSTR(third, ",")+1) WHERE INSTR(third, ",")>0; 

-- Many times as needed... 

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

+0

ошибка: нет такой функции 'INSTR'. Я нахожусь на Mac. Любое обходное решение? – Sriram

+0

Вы используете оболочку 'sqlite3'? Какая версия? –

+0

SQLite 3.7.7 2011-06-25 16:35:41 8f8b373eed7052e6e93c1805fc1effcf1db09366 – Sriram

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