Команда импорта, не включающая список слов в текстовый файл

#bash #sqlite

#bash #sqlite

Вопрос:

Я пытаюсь импортировать список слов в таблицу в sqlite3 однако ошибка, с которой я сталкиваюсь, заключается в том, что она не вставляет слово в таблицу. Это ошибка, которую я получаю: 0.out: 1: ожидалось 2 столбца, но найдено 1 — заполнение остальных значением NULL

Я пробовал разные кавычки с переменными в create table; тот же результат. Также пробовал использовать разные вставки, такие как ЗАГРУЗКА ДАННЫХ в ФАЙЛ, только для получения ошибки:

 Error: incomplete SQL: LOAD DATA INFILE 0.out INTO TABLE data0(word)
 

============================

sqlite3 $database.db << EOF

СОЗДАТЬ ТАБЛИЦУ $table (ЦЕЛОЕ ЧИСЛО ИДЕНТИФИКАТОРОВ, текстовое слово, ПЕРВИЧНЫЙ КЛЮЧ (идентификатор));

.импортировать таблицу $text $

.выход

EOF

============================

Текстовый файл содержит одно слово в строке

 all

all-inspiring
 

И когда предполагается, что он будет работать правильно, вывод будет выглядеть следующим образом:

 CREATE TABLE data0 (id integer,word text, primary key(id));

INSERT INTO data0 VALUES(1,'all');

INSERT INTO data0 VALUES(2,'all-inspiring');

etc.
 

Любая помощь будет высоко оценена.

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

1. Ваша таблица состоит из двух столбцов. Что бы .mode вы ни использовали .import , оно отображает только один столбец на каждую прочитанную запись, когда ему требуется одинаковое число как для таблицы, так и для записи. Отсюда предупреждение об использовании null для второго столбца.

2. Если вы поменяете порядок столбцов id и word, вы все равно получите предупреждения, но это может работать так, как вы предполагаете.

3. Я пробовал поменять местами id и word, но результат по-прежнему тот же. На данный момент я не указал .mode при запуске этого, так какой режим вы бы предложили?

Ответ №1:

Этот подход может сработать :

 #!/bin/bash 
# Make this a script so that side-effects are effectively wrapped
# without giving an end-user any hassle
file="tempfile"
nl -s, -w1 filename >> "$file"
# Above step makes a temporary CSV file for import adding line numbers in the beginning
database="yourdbname"
table="yourtablename"
sqlite3 "$database" <<EOF
CREATE TABLE ${table}(id INTEGER PRIMARY KEY,word TEXT);
.mode csv
.import $file $table
.exit
EOF
rm "$file" #Delete the temporary file
 

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

Проверьте

 sqlite3 yourdbname <<EOF
.separator ,
select * from yourtablename;
.quit
EOF
 

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

1. Спасибо sjsam! теперь результат получается именно таким, каким я его хочу!