Импортировать CSV в SQLite


117

Я пытаюсь импортировать файл CSV в таблицу SQLite.

Пример csv:

1,2
5,6
2,7

Пример команды:

sqlite> create table foo(a, b);
sqlite> .separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4

Я даже не уверен, почему он нашел четыре столбца с шестью частями данных и двумя столбцами.


Похоже, что команда ожидает заголовки столбцов в первой строке и что терминатор строки не распознается как таковой. 6 - 2 = 4
Mechanical_meat

Могу ли я указать терминатор строки, или он отсутствует в моем CSV?
Молли Уолтерс

1
Не похоже, что вы можете указать терминатор строки из инструмента командной строки SQLite. У вас есть текстовый редактор (например, Блокнот в Windows, но лучше), который покажет вам символы завершения строки? Существует три основных варианта: \r\nв Windows, \nв * nix (включая новые Mac) и \rв старых Mac.
Mechanical_meat

Я использую BBEdit, но я не вижу ни одного из этих символов в конце строк. Я пробовала добавлять их вручную, но, похоже, ничего не помогает ...
Молли Уолтерс

1
Этот веб-сайт может конвертировать файл CSV (или Excel) в SQLite - converttosqlite.com
Code Slinger

Ответы:


154

Что также говорится в комментариях, SQLite видит ваш ввод как 1, 25, 62, 7. У меня также была проблема, и в моем случае она была решена путем изменения «разделителя» на «.mode csv». Итак, вы можете попробовать:

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo

Первая команда создает имена столбцов для таблицы. Однако, если вы хотите, чтобы имена столбцов были унаследованы из файла csv, вы можете просто проигнорировать первую строку.


83
Для других людей, которые попадают сюда из поиска, если первая строка вашего CSV-файла содержит имена столбцов, вы можете пропустить первую create tableкоманду, и sqlite будет использовать имена столбцов из CSV-файла.
EarlCrapstone

2
@EarlCrapstone: не могли бы вы уточнить? Похоже, у меня это не работает.
d33tah

3
@ d33tah Взгляните на эти примеры . Обратите внимание, что первая строка содержит имена столбцов, Year,Make,Model,Description,Priceа не фактические данные. Если это так с вашим CSV-файлом, вам не нужно вручную создавать таблицу с помощью create tableкоманды. Команда .importбудет использовать первую строку в вашем файле, чтобы определить имена столбцов и создать таблицу соответственно. Вам все равно нужно включить имя таблицы в команду. Та же информация из документов SQLite .
EarlCrapstone

Почему ты сидишь .mode? Разве это не только для вывода?
Алан

Если вы обнаружите, что сгенерированная таблица группирует несколько столбцов вместе, убедитесь, что вы не используете зарезервированное слово, например, typeдля имени столбца CSV.
paulvs

29

Вот как я это сделал.

  • Сделать / преобразовать файл csv, чтобы он был разделен вкладками (\ t) И не заключался в кавычки (sqlite интерпретирует кавычки буквально - говорит старые документы)
  • Введите оболочку sqlite базы данных, в которую необходимо добавить данные

    sqlite> .separator "\t" ---IMPORTANT! should be in double quotes sqlite> .import afile.csv tablename-to-import-to


для нескольких строк моему tsv нужно было указать разделитель ROW с помощью этой команды .separator "\t" "\r"
mfink

1
При обсуждении форматов файлов tsv! = Csv
Алан

24

Я объединяю информацию из предыдущих ответов здесь со своим собственным опытом. Самый простой - добавить разделенные запятыми заголовки таблиц непосредственно в ваш CSV-файл, за которым следует новая строка, а затем все ваши CSV-данные.

Если вы больше никогда не занимаетесь sqlite (как я), это может сэкономить вам пару поисков в Интернете:

В оболочке Sqlite введите:

$ sqlite3 yourfile.sqlite
sqlite>  .mode csv
sqlite>  .import test.csv yourtable
sqlite>  .exit

Если на вашем Mac не установлен Sqlite, запустите

$ brew install sqlite3

Возможно, вам придется выполнить один поиск в Интернете, чтобы узнать, как установить Homebrew.


1
Как обрабатывать unescaped " characterпредупреждения?
TMOTTM

Если вы создадите таблицу перед импортом, она не будет искать заголовки.
Рольф

Мне нужно поместить файл в ту же папку, где находится sqlite3.exe. Могу ли я использовать другой путь для файла csv?
Jaydeep Karena

Незначительный момент: «Если у вас не установлен Sqlite на вашем Mac» ... AFAIK он установлен по умолчанию.
Laryx Decidua

8

перед командой .import введите ".mode csv"


5
.mode предназначен только для вывода
DeliriumTremens

9
Видимо не так. Из раздела .import doc: Обратите внимание, что важно установить «режим» на «csv» перед запуском команды «.import». Это необходимо, чтобы оболочка командной строки не пыталась интерпретировать текст входного файла как какой-либо другой формат.
Ричард - Rogue Wave Limited

8

Как импортировать файл CSV в sqlite3

  1. Создать базу данных

    sqlite3 NYC.db
  2. Установите режим и имя таблицы

    .mode csv tripdata
  3. Импортируйте данные файла csv в sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Найти столы

    .tables
  5. Найдите схему своей таблицы

    .schema tripdata
  6. Найти данные таблицы

    select * from tripdata limit 10;
  7. Подсчитайте количество строк в таблице

    select count (*) from tripdata;

4

С помощью Termsql вы можете сделать это одной строкой:

termsql -i mycsvfile.CSV -d ',' -c 'a,b' -t 'foo' -o mynewdatabase.db


ссылка была битая, поменял на репозиторий github - поясните пожалуйста!
Андреас Нидермайр

3

У меня была точно такая же проблема (в OS X Maverics 10.9.1 с SQLite3 3.7.13, но я не думаю, что SQLite связан с причиной). Я попытался импортировать данные CSV, сохраненные из MS Excel 2011, которые, кстати,. используется ';'как разделитель столбцов. Я обнаружил, что файл csv из Excel по-прежнему использует символ новой строки из Mac OS 9 раз, изменение его на новую строку unix решило проблему. AFAIR BBEdit имеет команду для этого, а также Sublime Text 2.


2
Его проще использовать, tr -s '\r' '\n'и он будет работать со всевозможными случайными файлами.
Donal Fellows


0

Как указывается на некоторых веб-сайтах и ​​в других статьях, просто взгляните на этот. https://www.sqlitetutorial.net/sqlite-import-csv/

Нам не нужно указывать разделитель для csvфайла, потому что csv означает разделение запятыми. sqlite> .separator ,нет необходимости в этой строке.

sqlite> create table cities(name, population);
sqlite> .mode csv
sqlite> .import c:/sqlite/city_no_header.csv cities

Это будет работать безупречно :)

PS: Мой файл cities.csv с заголовком.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014

2
Не забывай .save someFileNameв конце бежать . Мне потребовался час, чтобы найти это, чтобы наконец экспортировать это из файла базы данных памяти на диск 😅
ioopl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.