MYSQL importar datos desde csv usando LOAD DATA INFILE

106

Estoy importando algunos datos de 20000 filas de un archivo CSV a Mysql.

Las columnas del CSV están en un orden diferente al de las columnas de la tabla MySQL. ¿Cómo asignar automáticamente las columnas correspondientes a las columnas de la tabla Mysql?

Cuando ejecuto

LOAD DATA INFILE'abc.csv' INTO TABLE abc

esta consulta agrega todos los datos a la primera columna.

Sugiera una sintaxis automática para importar datos a Mysql.

MANJEET
fuente
Me pasó a mí, descubrí que el archivo de texto estaba escrito con líneas terminadas por '\ r' y estaba tratando de importar los datos esperando que las líneas terminaran usando '\ n'
Tamer
2
Escribí un extenso tutorial para cargar datos csv en mysql junto con una herramienta generadora de sintaxis en Excel . Debería ser útil para los lectores.
mysql_user

Respuestas:

169

Puede utilizar el comando LOAD DATA INFILE para importar un archivo csv a la tabla.

Consulte este enlace MySQL - LOAD DATA INFILE .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

Para usuarios de MySQL 8.0:

El uso de la LOCALpalabra clave contiene riesgos de seguridad y, a partir de MySQL 8.0, la LOCALcapacidad está configurada Falsede forma predeterminada. Es posible que vea el error:

ERROR 1148: El comando usado no está permitido con esta versión de MySQL

Puede sobrescribirlo siguiendo las instrucciones de los documentos . Tenga en cuenta que dicha sobrescritura no resuelve el problema de seguridad, sino más bien un reconocimiento de que está consciente y dispuesto a correr el riesgo.

Saharsh Shah
fuente
1
¿Puedo saber qué IGNORE 1 LINEShace exactamente aquí? Gracias por adelantado.
Koushik Das
5
@KoushikDas Ignorará la primera línea que define los nombres de las columnas
Saharsh Shah
28
precaución: la cláusula LINES TERMINATED BY '\ r \ n' funciona para archivos de Windows, pero los archivos de Linux solo deben tener '\ n'.
ChuckCottrill
1
Es importante recordar usar barras diagonales: stackoverflow.com/a/42878067/470749
Ryan
3
solo una nota que el (col1, col2, col3 ....) no es necesario. Útil si está creando una tabla sobre la marcha antes de usarla para insertar datos.
Kieran Quinn
51

Probablemente necesite establecer FIELDS TERMINATED BY ','el delimitador o el que sea.

Para un archivo CSV, su declaración debería tener este aspecto:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
ckim
fuente
1
CARGAR DATOS LOCAL INFILE ... Sin LOCAL se denegó el acceso.
ketankk
49

Antes de importar el archivo, debe preparar lo siguiente:

  • Una tabla de base de datos a la que se importarán los datos del archivo.
  • Un archivo CSV con datos que coinciden con el número de columnas de la tabla y el tipo de datos en cada columna.
  • La cuenta, que se conecta al servidor de la base de datos MySQL, tiene privilegios FILE e INSERT.

Supongamos que tenemos la siguiente tabla:

ingrese la descripción de la imagen aquí

CREAR TABLA UTILIZANDO LA SIGUIENTE CONSULTA:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

SU ARCHIVO CSV DEBE ESTAR ADJUNTAMENTE FORMATEADO POR EJEMPLO, VEA LA SIGUIENTE IMAGEN ADJUNTA:

ingrese la descripción de la imagen aquí

Si todo está bien ... Ejecute la siguiente consulta para CARGAR DATOS DEL ARCHIVO CSV:

NOTA: agregue la ruta absoluta de su archivo CSV

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Si todo ha hecho. ha exportado datos de CSV a la tabla con éxito

Soleado SM
fuente
¿Cómo podemos validar si el archivo CSV tiene el tipo de datos adecuado para cada columna porque de forma predeterminada ignora el tipo de datos no válido?
Umar Abbas
2
Lamento molestarme con una respuesta tan antigua. Es muy convincente, pero ¿cómo puedo omitir algún campo? Digamos que mi tabla tiene projectId, surveyId y dateTime, ¿cómo puedo omitir el campo "vistas"?
Danish Ansari
@MD Danish Ansari, Lamento responder una pregunta anterior, pero puede especificar las columnas de la tabla. Hice lo siguiente, donde necesito omitir el primer campo (una clave primaria de autoincremento), así como algunos otros campos: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS TERMINATED BY', 'ENCLOSED BY' "'LINES TERMINATED BY' \ r \ n '(UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); Pensé que las columnas deberían ir después de nombre de la tabla, pero eso no funcionó. Deberían aparecer al final.
kalinma
17

Sintaxis:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

Vea este ejemplo:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
Md. Nashir Uddin
fuente
10

Inserte a granel más de 7000000 registros en 1 minuto en la base de datos (consulta superrápida con cálculo)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP y RRP_nl y RRP_bl no están en csv pero se calcula eso y luego insertar eso.

Krunal Panchal
fuente
2

Si está ejecutando LOAD DATA LOCAL INFILEdesde el shell de Windows y necesita usarlo OPTIONALLY ENCLOSED BY '"', tendrá que hacer algo como esto para escapar de los caracteres correctamente:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out
Kikoz
fuente
2

supongamos que está utilizando xampp y phpmyadmin

tiene el nombre de archivo 'ratings.txt' el nombre de la tabla 'ratings' y el nombre de la base de datos 'movies'

si su xampp está instalado en "C: \ xampp \"

copie su archivo "ratings.txt" en la carpeta "C: \ xampp \ mysql \ data \ movies"

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

Espero que esto pueda ayudarlo a omitir su error si está haciendo esto en localhost

Mohammad Arshi
fuente
0

Puede cargar datos desde un archivo csv o de texto. Si tiene un archivo de texto con registros de una tabla, puede cargar esos registros dentro de la tabla. Por ejemplo, si tiene un archivo de texto, donde cada fila es un registro con los valores de cada columna, puede cargar los registros de esta manera.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

--ejemplo en windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 
Jorge T
fuente
0

Recibí el código de error: 1290. El servidor MySQL se está ejecutando con la opción --secure-file-priv, por lo que no puede ejecutar esta declaración

Esto funcionó para mí en Windows 8.1 de 64 bits con wampserver 3.0.6 de 64 bits.

Edité el archivo my.ini de C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Elimine la entrada secure_file_priv c: \ wamp64 \ tmp \ (o cualquier directorio que tenga aquí)

Detuvo todo -salir wamp, etc.- y reinició todo; luego batea mi archivo cvs en C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (el último directorio es el nombre de mi base de datos)

ejecutado LOAD DATA INFILE 'myfile.csv'

EN LA MESA alumnos

CAMPOS TERMINADOS POR ','

ENCERRADA POR '"'

LÍNEAS TERMINADAS POR '\ r \ n'

IGNORAR 1 LÍNEAS

... ¡¡¡y voilá!!!

Carlos garcia
fuente
0

Puedes intentar insertarlo así:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);
Hozayfa
fuente
0

En estos días (que finalizan en 2019) prefiero usar una herramienta como http://www.convertcsv.com/csv-to-sql.htm . Tienes muchas filas en las que puedes ejecutar bloques particionados y evitar errores de usuario cuando el csv proviene una hoja de cálculo del usuario final.

Jonathan Perrotta
fuente