Вопрос по database, sqlite – Как импортировать загрузить файл .sql или .csv в SQLite?

114

Мне нужно сбросить.sql или же.csv файл в SQLite (я использую SQLite3 API). Я нашел только документацию для импорта / загрузки таблиц, а не целые базы данных. Прямо сейчас, когда я печатаю:

sqlite3prompt> .import FILENAME TABLE 

Я получаю синтаксическую ошибку, так как она ожидает таблицу, а не всю БД.

Pertinent documentation alttag

Ваш Ответ

11   ответов
11

поскольку она обрабатывает любую запятую как разделитель даже в строке в кавычках.

Это включает в себя попытку повторно импортировать CSV-файл, созданный оболочкой:

Create table T (F1 integer, F2 varchar);
Insert into T values (1, 'Hey!');
Insert into T values (2, 'Hey, You!');

.mode csv
.output test.csv
select * from T;

Contents of test.csv:
1,Hey!
2,"Hey, You!"

delete from T;

.import test.csv T
Error: test.csv line 2: expected 2 columns of data but found 3

Кажется, мы должны преобразовать CSV в список операторов вставки, или, возможно, будет работать другой разделитель.

В SuperUser я увидел предложение использовать LogParser для работы с CSV-файлами, и я собираюсь разобраться с этим.

blairxy: ошибка, которую вы получаете, связана с запятой в "Эй, ты!". При загрузке 2-й строки Sqlite видит 3 столбца, а после удаления 2-й запятой вы можете загрузить ее без ошибок.
1

обязательно добавьте путь к БД в & quot; & quot; а также использовать двойную косую черту \ в пути, чтобы убедиться, что Windows понимает это.

21

Get SQLite from the website. At a command prompt run sqlite3 <your_db_file_name> *It will be created as an empty file. Make a new table in your new database. The table must match your CSV fields for import. You do this by the SQL command: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

После того, как вы создали таблицу и столбцы соответствуют вашим данным из файла, вы можете сделать выше ...

.mode csv <table_name>
.import <filename> <table_name>
Ты спас мои недели. Я закончил свою работу за 3 секунды. Я преобразовал файл CSV 120 МБ в .db всего за 5 секунд.
Чувак, это не отвечает на вопрос. Это связано, но не ответ на ...
@jacob просто к вашему сведению, этот ответ почти4 лет, и человек, который его опубликовал, не был здесь более трех лет.
7

что разделителем по умолчанию для SQLite является труба & quot; | & quot;

sqlite> .separator ";"

sqlite> .import path/filename.txt tablename 

http://sqlite.awardspace.info/syntax/sqlitepg01.htm#sqlite010

159

sqlite> .read <filename>

Для импорта из файла CSV вам необходимо указать тип файла и таблицу назначения:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>
@ krishna222, заthe documentationесли таблица не существует, первая строка CSV будет использоваться в качестве имени столбца; если таблица существует, все строки обрабатываются как данные.
как он получает имена столбцов, если их нет в файле csv?
Выдает ошибку "не могу открыть db.sql", когда я использую .read commond.
Это правильный ответ, но иногда он задыхается от фанки / испорченных файлов CSV.
1

https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Он преобразует текст в SQL в командной строке. (CSV это просто текст)

Пример:

cat textfile | termsql -o sqlite.db

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

cat textfile | termsql -d ',' -o sqlite.db

В качестве альтернативы вы можете сделать это:

termsql -i textfile -d ',' -o sqlite.db

По умолчанию он генерирует имена столбцов «COL0», «COL1», если вы хотите, чтобы он использовал первую строку для имен столбцов, которые вы делаете так:

termsql -i textfile -d ',' -1 -o sqlite.db

Если вы хотите установить пользовательские имена столбцов, вы делаете это:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db
25

cat dump.sql | sqlite3 database.db

Это, очевидно, будет работать только с операторами SQL в dump.sql. Я не уверен, как импортировать CSV.

@JavierBuzzi: Извините, но это не имеет смысла. Эти два метода эквивалентны. Должно быть, у вас было что-то еще, когда вы попробовали один или другой метод. При стабильных условиях тестирования гарантирую, что разницы в скорости не будет.
Я думаю, что это будет работать точно так же, но пользователь должен убедиться, что настройки sqlite3 были настроены для.mode csv
Просто хочу сделать комментарий здесь, это на самом деле на 100%,sqlite3 database.db < dump.sql ТАК МЕДЛЕННО !!! Так что используйтеcat dump.sql | sqlite3 database.db вместо! : D
1

так как он также позволяет использовать SQLiteточечные команды в синтаксисе SQL (хотя они интерпретируются CLI). Это означает, что вы можете делать такие вещи.

Создатьsms таблица как это:

# sqlite3 mycool.db '.schema sms'
CREATE TABLE sms (_id integer primary key autoincrement, Address VARCHAR, Display VARCHAR, Class VARCHAR, ServiceCtr VARCHAR, Message VARCHAR, Timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp);

Затем два файла:

# echo "1,ADREZZ,DizzPlay,CLAZZ,SMSC,DaTestMessage,2015-01-24 21:00:00">test.csv

# cat test.sql
.mode csv
.header on
.import test.csv sms

Чтобы проверить импорт файла CSV с использованием файла SQL, выполните:

# sqlite3 -csv -header mycool.db '.read test.sql'

В заключение, это означает, что вы можете использовать.import оператор в SQLite SQL, как вы можете сделать в любой другой RDB, как MySQL сLOAD DATA INFILE и т.д. Однако это не рекомендуется.

0

CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name COLLATE NOCASE);
CREATE TABLE temp_table (name COLLATE NOCASE);

.import predefined/myfile.txt temp_table 
insert into my_table (name) select name from temp_table;

myfile.txt - это файл в C: \ code \ db \ предопределенный \

data.db находится в C: \ code \ db \

myfile.txt содержит строки, разделенные символом новой строки.

Если вы хотите добавить больше столбцов, их легче разделить с помощью символа канала, который используется по умолчанию.

10

то есть скрипт python, который автоматизирует это по адресу:https://github.com/rgrp/csv2sqlite

Это автоматически создаст таблицу для вас, а также проведет для вас базовое угадывание типов и приведение данных (например, он сработает, если что-то будет числом, и установит тип столбца как «реальный»).

Почти работает - строка заголовка импортирует ОК. Однако тогда я получаюsqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings # csv2sqlite.py {csv-file-path} {sqlite-db-path} [{table-name}]
Хм, я никогда не видел эту ошибку, используя это. Вы использовали не-Unicode или не-UTF8 данные? В этом случае вам может понадобиться настроить скрипт, чтобы открыть файл CSV, используя определенную кодировку, которую он использует.
Примерно в то же время я написал сценарий ruby, который делает то же самое !! Он должен даже работать с несколькими CSV-файлами одновременно, угадывая имя таблицы по имени файла.github.com/dergachev/csv2sqlite
Нам нужно прочитать файл sys.stdin, поскольку нам нужно конвертировать файл csv.gz размером 60 ГБ. Или есть ли шанс получить поддержку чтения gzip в csv2sqlite? Спасибо!
@markusN откройте проблему на трекере github. Как правило, я бы беспокоился о файле 100 ГБ + CSV в sqlite (если бы у вас была «правильная» RDB, например postgres или даже bigquery, красное смещение и т. Д.)
-1

phpLiteAdmin, это превосходно.

Похожие вопросы