2010-01-26 21 views
48

Tengo un archivo CSV con 11 columnas y tengo una tabla MySQL con 9 columnas.Cómo saltear columnas en un archivo CSV al importar a la tabla MySQL utilizando LOAD DATA INFILE?

El archivo CSV se parece a:

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

y la tabla de MySQL se parece a:

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

necesito para mapear las columnas 1-8 de archivo CSV directamente a las 8 primeras columnas de la tabla de MySQL Luego, debo omitir las dos columnas siguientes en el archivo CSV y luego asignar la columna 11 del archivo CSV a la columna 9 de la tabla MySQL.

Por el momento estoy usando el siguiente comando SQL:

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

Pero el código anterior mapas de los primeros 9 columnas de archivo CSV a las 9 columnas de la tabla MySQL.

+0

Esto podría ayudar: http://stackoverflow.com/questions/22988337/csv-file- skip-column-in-import-db/22988896 # 22988896 –

Respuesta

70

From Mysql docs:

También se puede descartar un valor de entrada por asignarlo a una variable de usuario y no asignar la variable a una columna de tabla :

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

FYI: Tuve que agregar la declaración de campo '(column1, @dummy, column2 ...' al final de mi SQL de ejemplo. Inicialmente lo había agregado directamente después el nombre de la tabla como se muestra en el ejemplo anterior, pero seguí recibiendo un error de MySQL. – Camsoft

+0

alguien me puede decir cómo puedo ignorar el @dummy – deemi

+0

Usted ne ed al menos 'FIELDS TERMINATED BY ','' para evitar que "Row 1 no contenga datos para todas las columnas" –

4

paso 1. lidiar con awk.

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

step2.load en MySQL.

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

el método siguiente es simple, pero no permitido en versión inferior de MySQL.

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

Me gusta el uso de awk aquí para mostrar la belleza de encadenar múltiples herramientas juntas. – Paul

+0

alguien me puede decir cómo puedo ignorar el @dummy – deemi

0

@deemi:

La única manera de ignorar la @dummy es mediante la configuración predeterminada por el campo para AUTO INCREMENT. lo que puede saltarse el campo y el código al igual que este,

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

// asume que el nombre del campo column1 se establece en AUTO INCREMENT por defecto.

0

Creo que hay un cambio más en el código:

El siguiente comando SQL:

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

-Will lugar probablemente a un error de truncamiento de datos.

Por lo tanto, es mejor utilizar LINES TERMINATED BY '\r\n' en lugar de LINES TERMINATED BY '\n'

lo que el código será:

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