2010-09-09 9 views
6

Wszystko,SQLite - wstawienie łańcuch z nowymi liniami do bazy danych z pliku csv

Próbuję wstrzyknąć długiego wpisu tekstowego do bazy danych SQLite, w polu tekstowym. Ten tekst zawiera nowe linie (to znaczy obejmuje wiele akapitów).

mogę uzyskać nowe linie, aby pokazać się, czy zrobić INSERT ręcznie:

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

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

ale jeśli mam równoważny tekst w pliku CSV i próbować .import go do tabeli, otrzymuję błąd, że oczekuje więcej kolumn niż istnieje (od razu po napotkaniu nowego wiersza program przyjmuje, że jest to koniec danych wejściowych, a zatem brakuje kolumn).

Czy to możliwe? Czy jest to jedyny sposób ręcznego wykonywania każdego INSERT?

Odpowiedz

4

Twój problem jest format csv: sqlite nie obsługuje wartości zawierające nowe linie.

W sqlite dialekcie:

  • przecinkami osobne pola

  • Podwójne cudzysłowy mogą być wykorzystane do grupy pole, które zawiera przecinków.

  • Nowe linie wyznaczają zapisy

albo trzeba uciec/usunąć swoje nowe linie, albo użyć innego bardziej odpowiedniego formatu pliku.

Poniższy (SED) regularne expresion będzie "usuń" niechcianych linii zasila

s/\(,"[^",]*\)$/\1\1/g 
+0

Dobra uwaga i dziękuję za przeczytanie pytania. Sądzę, że CSV nie nadaje się do tego, co chcę robić. – I82Much

+1

"Oficjalna" definicja 'text/csv' (RFC 4180) zezwala na podział linii w polach. Niestety nie każda implementacja je obsługuje. A CSV ma kilka innych powodów, dla których nie nadaje się do tabel SQL, a dużym jest brak sposobu na rozróżnienie między '' '' i 'NULL'. – dan04

+0

Poprzednio odrzucono, ale zmieniono na upvote po tym, jak zredagowałem, aby wyjaśnić, że obsługa CSV w sqlite jest ograniczona. Jak mówi @ dan04, wartości kolumn csv mogą zawierać znaki nowej linii i wiele narzędzi wspiera to. –

3

Wystarczy prosty googling dała mi wynik

http://www.mail-archive.com/[email protected]/msg43557.html

Tak można:

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> 

Nadzieję, że to pomaga!

+0

Czy to oznacza, że ​​muszę zastąpić wszystkie \ n "z" ... "? – karim

0

Jeśli to w aplikacji, chciałbym użyć parametryczne/przygotowane oświadczenie, przynajmniej dla tych wartości, które nie są stałe:

db.execSQL("INSERT INTO LOGENTRY " + 
    "VALUES(?, ?, ?, ?, ?, ?, ?, '', NULL)", 
    new Object[]{5, 40, place, text, num, x, t2}); 
+0

Dzięki, ale nie jest to w aplikacji. – I82Much

-1

Spróbuj "echo -n", lub użyć coś jak echo "Plik" | tr '\ n' ''

Pozdrawiam.

Powiązane problemy