импорт sqlite3 с кавычками

Я пытаюсь импортировать набор данных с кавычками в полях. В настоящее время они разделены вкладками.

Из того, что я могу понять в соответствии с документами (http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles), оболочка sqlite должна интерпретировать кавычки буквально, и я предполагаю, что это означает, что у меня не должно быть проблем.

Я столкнулся с проблемой в этой строке:

1193782372  Lips Like Sugar (12" Mix)   Echo & the Bunnymen 80's/12": The Extended Collection   a76d9b04-51d9-4672-801f-356ab36dbae7    ccd4879c-5e88-4385-b131-bf65296bf245    1abb270a-e791-407f-a989-ff3ad6f8401c

Поскольку неясно, где находятся вкладки, я включил их в следующую строку.

1193782372\tLips Like Sugar (12" Mix)\tEcho & the Bunnymen\t80's/12": The Extended Collection\ta76d9b04-51d9-4672-801f-356ab36dbae7\tccd4879c-5e88-4385-b131-bf65296bf245\t1abb270a-e791-407f-a989-ff3ad6f8401c

Я пытаюсь сделать следующее, но получаю сообщение об ошибке.

sqlite> .separator \t
sqlite> .import ./file.txt table
Error: ./file.txt line n: expected 7 columns of data but found 5

Он работает без двойных кавычек, но кавычки важны. Кажется, я тоже не могу избежать кавычек с помощью \".

Как правильно импортировать нужные мне данные?


person benuuu    schedule 04.03.2013    source источник


Ответы (4)


Веб-страница, на которую вы ссылаетесь, устарела (обратите внимание на часть URL-адреса cvstrac, которая является бесплатной; sqlite теперь использует ископаемое, а не cvs). Более новая версия этой веб-страницы находится здесь.

Поскольку SQLite является общедоступным программным обеспечением, одним из решений вашей проблемы является исправление оболочки sqlite.c для правильной обработки вашего формата файла. Проблема связана со строкой 1861, которая делает

if( c=='"' ) inQuote = !inQuote;

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

Другой подход заключается в использовании диспетчера баз данных, который поддерживает SQLite; их много, и большинство из них утверждают, что поддерживают импорт/экспорт файлов.

person Doug Currie    schedule 05.03.2013
comment
этот ответ устарел; Я не могу найти строку, которую вы называете строкой 1861 на shell.c. - person kimbaudi; 08.06.2019

Инструмент .import Sqlite3 ведет себя так, как если бы его ввод был в формате значений, разделенных запятыми, даже если .separator не является запятой. Вы можете избежать кавычек (""), удвоив их ("") и заключив в кавычки все поле, в котором они встречаются.

Я получил чистый .import ваших тестовых данных, пропустив его через следующий фильтр:

sed 's/"/""/g;s/[^\t]*/"&"/g' file.txt >quoted.txt
person flabdablet    schedule 04.04.2013
comment
хорошее решение! просто хочу отметить, что sed на Mac, похоже, не обрабатывает символ табуляции (\t), поэтому я использовал цитирование в стиле ANSI-C, добавив перед ним $, и это также работает на Mac: sed $'s/"/""/g;s/[^\t]*/"&"/g' file.txt >quoted.txt - person kimbaudi; 08.06.2019

Инструмент командной строки sqlite3 не очень гибок в том, какие форматы импорта он поддерживает.

Ты мог бы

  • изменить файл импорта, чтобы добавить двойные кавычки вокруг и избежать двойных кавычек в полях; или
  • преобразовать файл импорта в серию операторов SQL:

    INSERT INTO MyTable VALUES(
        1193782372,
        'Lips Like Sugar (12" Mix)',
        'Echo & the Bunnymen 80''s/12": The Extended Collection',
        'a76d9b04-51d9-4672-801f-356ab36dbae7',
        'ccd4879c-5e88-4385-b131-bf65296bf245',
        '1abb270a-e791-407f-a989-ff3ad6f8401c');
    

    or

  • написать свой собственный инструмент импорта.
person CL.    schedule 05.03.2013

Чтобы сделать это без изменения входных данных или исходного кода sqlite, используйте режим ascii и установите разделитель столбцов на табуляцию, а разделитель строк на CRLF (windows) или \n (*nix).

окна:

sqlite> .mode ascii
sqlite> .separator "\t" "\r\n"
sqlite> .import ./file.txt table

*никс

sqlite> .mode ascii
sqlite> .separator "\t" "\n"
sqlite> .import ./file.txt table

См. мой ответ на этот вопрос для объяснение почему.

person Ebow Halm    schedule 07.10.2020