2010-09-09 10 views
6

Tutti,SQLite - l'inserimento di una stringa con a capo nella base di dati da file CSV

sto cercando di iniettare una voce di testo lungo in un database SQLite, in un campo di testo. Questo testo contiene nuove righe (ad esempio, si estende su più paragrafi).

posso ottenere le nuove linee di presentarsi se faccio l'inserire manualmente:

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

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

ma se ho il testo equivalente in un file CSV e tento di .import nella tabella, ottengo un errore che prevede più colonne di quante ne esistano (non appena viene rilevata la nuova riga, il programma presume che è la fine dell'input e quindi mancano le colonne).

È possibile? O è l'unico modo per fare manualmente ogni INSERT?

risposta

4

Il tuo problema è il formato CSV: SQLite non supporta i valori che contengono a capo.

Nel dialetto sqlite:

  • Virgole campi separati

  • doppi apici possono essere usate per raggruppare un campo che contiene le virgole.

  • Nuove linee delimitano record

Si sia bisogno di fuggire/togliere le nuove linee, oppure, usare qualche altro formato di file più adatto.

Il seguente (sed) expresion regolare sarà "cancella" linea indesiderata feed

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

Buon punto, e grazie per aver effettivamente letto la domanda. Immagino che CSV sia inadatto per quello che voglio fare. – I82Much

+1

La definizione "ufficiale" 'text/csv' (RFC 4180) consente interruzioni di riga all'interno dei campi. Sfortunatamente, non tutte le implementazioni li supportano. E CSV ha molti altri motivi per non essere adatto alle tabelle SQL, un grosso problema è la mancanza di un modo per distinguere tra '' 'e' NULL'. – dan04

+0

Precedentemente ho downvoted, ma cambiato a upvote dopo che ho modificato per chiarire che il supporto csv di sqlite è limitato. Come dice @ dan04, i valori delle colonne csv possono contenere newline e molti strumenti lo supportano. –

3

Proprio semplice googling mi ha dato il risultato

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

Sì, è possibile:

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> 

Speranza che aiuta!

+0

vuol dire che devo sostituire tutto '\ n' con '...'? – karim

0

Se è all'interno dell'applicazione, vorrei usare una dichiarazione con parametri/preparato, almeno per quei valori che non sono costanti:

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

Grazie, ma non è all'interno di un'applicazione. – I82Much

-1

Prova "echo -n", o usare qualcosa come echo "file" | tr '\ n' ''

Cordiali saluti.

Problemi correlati