SQLite - вставка строки с символами новой строки в базу данных из CSV-файла - PullRequest
6 голосов
/ 09 сентября 2010

Все,

Я пытаюсь ввести длинную текстовую запись в базу данных SQLite, в поле TEXT.В этом тексте есть новые строки (т. Е. Он охватывает несколько абзацев).

Если я сделаю ВСТАВКУ вручную, я могу получить новые строки:

INSERT INTO "LOGENTRY" VALUES(5,40,'PLACE','line1
line2

line4
',1283990533315,'4A','TEXT','',NULL);

, но если у меня естьЭквивалентный текст в CSV-файле и попытка импортировать его в таблицу. Я получаю сообщение об ошибке, что ожидается больше столбцов, чем существует (как только встречается новая строка, программа предполагает, что это конец ввода, и поэтомупропущенные столбцы).

Возможно ли это?Или это единственный способ сделать каждую вставку вручную?

Ответы [ 4 ]

5 голосов
/ 09 сентября 2010

Ваша проблема в формате csv: sqlite не поддерживает значения, содержащие переводы строк.

На диалекте sqlite:

  • Запятые в отдельных полях

  • Двойные кавычки могут использоваться для группировки поля, содержащего запятые.

  • Новые строки разделяют записи

Вам необходимо либо экранировать / удалить новые строки, либо использовать другой, более подходящий формат файла.

Следующее (sed) регулярное выражение «удалит» нежелательную строкуканалы

s/\(,"[^",]*\)$/\1\1/g
3 голосов
/ 09 сентября 2010

Просто простое прибегая к помощи дало мне результат

http://www.mail-archive.com/sqlite-users@sqlite.org/msg43557.html

Да, вы можете:

SQLite version 3.6.14.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table x ( a );
sqlite> INSERT INTO x VALUES('line1
   ...> line2');
sqlite> SELECT a FROM x;
line1
line2
sqlite> SELECT hex(a) FROM x;
6C696E65310A6C696E6532
sqlite>

Надеюсь, это поможет!

0 голосов
/ 09 июня 2013

Попробуйте "echo -n" или используйте что-то вроде echo "file" | tr '\ n' ''

С уважением.

0 голосов
/ 09 сентября 2010

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

db.execSQL("INSERT INTO LOGENTRY " +
    "VALUES(?, ?, ?, ?, ?, ?, ?, '', NULL)", 
    new Object[]{5, 40, place, text, num, x, t2});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...