2013-03-04 23 views
6

Sto tentando di importare una raccolta di dati con citazioni all'interno dei campi. Attualmente sono tab separati.sqlite3 import con le virgolette

Da quello che posso capire in base alla documentazione (http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles), la shell sqlite deve interpretare le virgolette letteralmente e presumo che ciò non dovrebbe avere un problema.

Sono stato in esecuzione in un problema su questa linea:

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 

Poiché non è chiaro dove le schede sono, li ho incluso in questa riga seguente.

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 

Sto provando a fare quanto segue ma ottenendo un errore.

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

Funziona senza virgolette, ma le virgolette sono importanti. Non riesco a sfuggire alle citazioni con \".

Come posso importare correttamente i dati che desidero?

risposta

2

La pagina Web di riferimento è vecchia (notare la parte cvstrac dell'URL, che è il giveaway; sqlite utilizza fossile ora, non cvs). La versione più recente di tale pagina Web è here.

Poiché SQLite è un software di dominio pubblico, una soluzione al problema è risolvere sqlite's shell.c per gestire correttamente il formato del file. Il problema è che attorno alla riga 1861 che fa

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

Se non si desidera citazione di delimitazione, basta commentare questa riga. Lo scopo della linea è di incorporare i delimitatori nelle colonne citando la colonna.

Un altro approccio consiste nell'utilizzare un gestore database che supporta SQLite; ce ne sono molti, e molti sostengono di supportare l'importazione/esportazione di file.

1

Lo strumento da riga di comando sqlite3 non è molto flessibile nei formati di importazione supportati.

Si potrebbe

  • cambiamento del file di importazione per aggiungere le virgolette attorno e la fuga virgolette nei campi; o
  • convertire il file di importazione in una serie di istruzioni 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'); 
    

    o

  • scrivere il proprio strumento di importazione.
5

Lo strumento .import di Sqlite3 si comporta come se il suo input fosse in formato valori separati da virgole, anche se .separator non è una virgola. È possibile evitare le virgolette (") raddoppiandole (" ") e citando l'intero campo in cui si verificano.

Ho ottenuto una pulizia.importare i dati di test dopo averlo eseguito attraverso il seguente filtro:

sed 's/"/""/g;s/[^\t]*/"&"/g' file.txt >quoted.txt 
Problemi correlati