2010-01-26 22 views
48

Ho un file CSV con 11 colonne e ho una tabella MySQL con 9 colonne.Come saltare le colonne nel file CSV quando si importa nella tabella MySQL utilizzando LOAD DATA INFILE?

Il file CSV si presenta come:

col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11 

e la tabella di MySQL si presenta come:

col1, col2, col3, col4, col5, col6, col7, col8, col9 

ho bisogno di mappare le colonne 1-8 di file CSV direttamente ai primi 8 colonne di la tabella MySQL. Ho quindi bisogno di saltare le prossime due colonne nel file CSV e quindi mappare la colonna 11 del file CSV alla colonna 9 della tabella MySQL.

Al momento sto utilizzando il seguente comando SQL:

LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' 

Ma il codice sopra mappe delle prime 9 colonne del file CSV alle 9 colonne della tabella di MySQL.

+0

Questo potrebbe aiutare: http://stackoverflow.com/questions/22988337/csv-file- skip-column-in-import-db/22988896 # 22988896 –

risposta

70

From Mysql docs:

È anche possibile eliminare un valore di ingresso da assegnando ad una variabile utente e non assegnare la variabile di un colonna della tabella:

LOAD DATA INFILE 'file.txt' 
INTO TABLE t1 (column1, @dummy, column2, @dummy, column3); 
+9

FYI: Ho dovuto aggiungere l'istruzione di campo '(column1, @dummy, column2 ...' alla fine del mio esempio SQL. Inizialmente l'avevo aggiunta direttamente dopo il nome della tabella come mostrato nell'esempio precedente ma ho continuato a ricevere un errore MySQL. – Camsoft

+0

qualcuno può dirmi come posso ignorare la @dummy – deemi

+0

almeno "I CAMPI TERMINATI DA", "per evitare" La riga 1 non contiene dati per tutte le colonne " –

4

step1. trattare con awk.

cat file.txt |awk '{print $1,$2,$5...}'>new_file.txt 

step2.load in mysql.

load data local infile 'new_file' into table t1(...) 

il seguente metodo è semplice, ma non ammessi nella versione inferiore mysql.

LOAD DATA INFILE 'file.txt' 
INTO TABLE t1 (column1, @dummy, column2, @dummy, column3); 
+0

Mi piace l'uso di awk qui nel mostrare la bellezza di concatenare più strumenti insieme. – Paul

+0

qualcuno può dirmi come posso ignorare la @dummy – deemi

0

@deemi:

L'unico modo per ignorare la @dummy è di impostazione predefinita del campo per AUTO INCREMENT. Così si può saltare il campo e proprio codice come questo,

LOAD DATA INFILE 'file.txt' 
INTO TABLE t1 (column2, column3, column4, column5); 

// presuppone che il nome del campo column1 è impostato su AUTO INCREMENT per impostazione predefinita.

0

penso che ci sia un altro cambiamento nel codice:

il seguente comando SQL:

LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' 

-Will probabilmente porterà ad un errore di dati troncamento.

Quindi è meglio usare LINES TERMINATED BY '\r\n' invece di LINES TERMINATED BY '\n'

modo che il codice sarà:

LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\r\n' 
Problemi correlati