Импорт CSV в SQLite

73

Я пытаюсь импортировать файл 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

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

  • 0
    Похоже, что команда ожидает заголовки столбцов в первой строке, и что терминатор строки не распознается как таковой. 6 - 2 = 4
  • 0
    Могу ли я указать терминатор строки или его нет в моем csv?
Показать ещё 7 комментариев
Теги:
sqlite3

6 ответов

96

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

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo
  • 66
    Для других людей, которые попадают сюда из поиска, если первая строка вашего CSV-файла содержит имена столбцов, то вы можете опустить первую команду create table и sqlite будет использовать имена столбцов из CSV-файла.
  • 2
    @EarlCrapstone: не могли бы вы уточнить? Кажется, это не работает для меня.
Показать ещё 5 комментариев
18

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

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

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

  • 0
    для нескольких строк моему tsv нужно было указать разделитель ROW с помощью этой команды .separator "\t" "\r"
  • 0
    При обсуждении форматов файлов tsv! = Csv См. Tools.ietf.org/html/rfc4180.
6

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

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

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

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

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

$ brew install sqlite3

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

  • 1
    Как обрабатывать unescaped " character оповещения?
  • 0
    Если вы создадите таблицу перед импортом, она не будет искать заголовки.
4

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

  • 3
    .mode только для вывода
  • 5
    Видимо, не так. Из раздела .import doc: обратите внимание, что важно установить для «mode» значение «csv» перед запуском команды «.import». Это необходимо для того, чтобы оболочка командной строки не пыталась интерпретировать текст входного файла как какой-либо другой формат.
3

TERMSQL

С termql вы можете сделать это в одной строке:

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

  • 0
    ссылка была битая, поменял ее на репозиторий github - уточните пожалуйста!
3

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

  • 2
    Проще использовать tr -s '\r' '\n' и это будет работать со всеми видами случайных файлов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню