Імпортуйте 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
механічний_міс

Чи можу я вказати лінійний термінатор або в моєму CSV відсутній?
Моллі Уолтерс

1
Не схоже, що ви можете вказати лінійний термінатор з інструмента командного рядка SQLite. Чи є у вас текстовий редактор (наприклад, Блокнот для Windows, але краще), який покаже вам символи, що закінчуються рядками? Є три основні варіанти: \r\nу Windows, \nу * nix (включає новіші Macs), \rна старих Macs.
Mechan_meat

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

1
Цей веб-сайт може конвертувати файл CSV (або Excel) в SQLite - converttosqlite.com
Код

Відповіді:


153

Що також говориться в коментарях, 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 оболонки db, до якої потрібно додати дані

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


для декількох рядків мені потрібно було вказати .separator "\t" "\r"
tvv

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

Незначна точка: "Якщо у вас на Mac не встановлений Sqlite" ... AFAIK він встановлений за замовчуванням.
Laryx Decidua

8

перед командою .import введіть ".mode csv"


5
.mode призначений лише для виводу
DeliriumTremens

9
Мабуть, не так. З розділу .import doc: Зауважте, що перед запуском команди ".import" важливо встановити "режим" на "csv". Це необхідно, щоб оболонка командного рядка не намагалася інтерпретувати текст вхідного файлу як якийсь інший формат.
Річард - 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;


3

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


2
Це простіше у використанні, tr -s '\r' '\n'і це буде працювати з усілякими випадковими файлами.
стипендіати


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: Мій міст.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.