¿Cómo importo un archivo CSV a una tabla MySQL?

Resuelto Iain Samuel McLean Elder asked hace 14 años • 21 respuestas

Tengo un diario de eventos CSV no normalizado de un cliente que estoy intentando cargar en una tabla MySQL para poder refactorizarlo en un formato sano. Creé una tabla llamada 'CSVImport' que tiene un campo para cada columna del archivo CSV. El CSV contiene 99 columnas, por lo que esta fue una tarea bastante difícil en sí misma:

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

No hay restricciones en la tabla y todos los campos contienen valores VARCHAR(256), excepto las columnas que contienen recuentos (representados por INT), sí/no (representados por BIT), precios (representados por DECIMAL) y anuncios de texto ( representado por TEXTO).

Intenté cargar datos en el archivo:

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

Toda la mesa está llena de NULL.

Creo que el problema es que los anuncios de texto contienen más de una línea y MySQL está analizando el archivo como si cada nueva línea correspondiera a una fila de la base de datos. Puedo cargar el archivo en OpenOffice sin problemas.

El archivo clientdata.csv contiene 2593 líneas y 570 registros. La primera línea contiene nombres de columnas. Creo que está delimitado por comas y el texto aparentemente está delimitado por comillas dobles.

ACTUALIZAR:

En caso de duda, lea el manual: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

Agregué información a la LOAD DATAdeclaración de que OpenOffice fue lo suficientemente inteligente como para inferir y ahora carga la cantidad correcta de registros:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Pero todavía hay muchos NULLregistros completos y ninguno de los datos que se cargaron parece estar en el lugar correcto.

Aceptado

Utilice mysqlimport para cargar una tabla en la base de datos:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

Lo encontré en http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Para convertir el delimitador en una pestaña, use--fields-terminated-by='\t'

michalzuber avatar Jun 12 '2013 16:06 michalzuber

El núcleo de su problema parece ser hacer coincidir las columnas del archivo CSV con las de la tabla.

Muchos clientes gráficos de MySQL tienen muy buenos cuadros de diálogo de importación para este tipo de cosas.

Mi favorito para este trabajo es HeidiSQL basado en Windows . Le brinda una interfaz gráfica para crear el LOAD DATAcomando; puede reutilizarlo mediante programación más adelante.

Importar archivo de texto

Captura de pantalla: cuadro de diálogo "Importar archivo de texto"

Para abrir el cuadro de diálogo "Importar archivo de texto", vaya a Tools > Import CSV file:

ingrese la descripción de la imagen aquí

Pekka avatar Sep 03 '2010 11:09 Pekka

La forma más sencilla de importar más de 200 filas es debajo del comando en la ventana SQL de phpmyadmin

Tengo una tabla simple de país con dos columnas CountryId,CountryName

aquí están los datos .csvARCHIVO CSV

aquí está el comando:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Tenga en cuenta una cosa: nunca aparezca en la segunda columna; de lo contrario, la importación se detendrá.

DareDevil avatar Jun 11 '2014 18:06 DareDevil

Utilicé este método para importar más de 100.000 registros ( ~5 MB ) en 0,046 segundos.

Así es como lo haces:

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Es muy importante incluir la última línea, si tiene más de un campo, es decir, normalmente se omite el último campo (MySQL 5.6.17).

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Luego, suponiendo que tiene la primera fila como título para sus campos, es posible que desee incluir esta línea también

IGNORE 1 ROWS

Así es como se ve si su archivo tiene una fila de encabezado.

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);
Fahad avatar Mar 21 '2017 16:03 Fahad