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

Tengo un CSV de diario de eventos no normalizado de un cliente que estoy tratando de cargar en una tabla MySQL para poder refactorizar 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 borrones de texto ( representado por TEXTO).

Traté de 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 borradores 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 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 los nombres de las columnas. Creo que está delimitado por comas y el texto aparentemente está delimitado por comillas dobles.

ACTUALIZACIÓN:

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

Agregué algo de información al LOAD DATA declaración de que OpenOffice fue lo suficientemente inteligente para inferir, y ahora carga el número correcto 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 NULL registros, y ninguno de los datos que se cargaron parece estar en el lugar correcto.

preguntado el 03 de septiembre de 10 a las 08:09

Y si estás en OSX Secuela pro tiene una herramienta de importación increíble y es GRATIS ;-)-

Me sorprende que el póster original haya respondido a su propia pregunta mejor que nadie ... No sé por qué tanta gente está tan dispuesta a dar recomendaciones de software cuando existe un comando SQL, que puede ser programático en lugar de basado en la interfaz de usuario. No conozco a nadie más, pero la programación significa para mí que puedo tener scripts configurados para importar automáticamente archivos en marcas de tiempo, mientras que la interfaz de usuario es puramente manual. -

@ChrisCirefice: Creo que la respuesta aceptada lo explica bien. Necesitaba ayuda para crear manualmente el comando "cargar datos", con el que un programa gráfico puede ayudar. Una vez que el programa gráfico había creado el comando "cargar datos", podía reutilizarlo mediante programación. -

@Merrick esto funcionó de maravilla en osx -

Los scripts de @ChrisCirefice son increíbles para eventos repetidos; pero las GUI son mejores para cosas de una sola vez, porque no tienes que averiguar todo el esoteria solo para hacer una sola cosa una vez:

19 Respuestas

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 diálogos de importación muy agradables para este tipo de cosas.

Mi favorito para el trabajo está basado en Windows. HeidiSQL. Le brinda una interfaz gráfica para construir el LOAD DATA mando; puede reutilizarlo más tarde mediante programación.

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:

enter image description here

Respondido el 24 de diciembre de 15 a las 19:12

Para Mac OSX, use Sequel Pro. - Ladrón de martillos Agi

Lo intenté y me obliga a crear la tabla primero ... en lugar de usar los nombres de las columnas. - Dominica

Tienes que seleccionar una mesa antes de poder continuar ... y dado que el punto es no tener que hacer la mesa ... - Dominica

Tenga en cuenta que en Linux, HeidiSQL funciona muy bien en Wine. - alejandrovd

@Pablo el mismísimo punto La respuesta es que las herramientas de GUI pueden facilitar la comparación de columnas de importación con columnas de tabla. - Pekka

Utiliza la 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, utilice --fields-terminated-by='\t'

Respondido 16 Abr '17, 23:04

mysqlimport usos LOAD DATA INFILE... detrás de escena, por lo que es más o menos lo mismo. - Mladen Jablanovic

Al igual que con LOAD DATA INFILE, debe crear una tabla antes de poder usar mysqlimport. - marcus downing

@ MladenJablanović, definitivamente no es lo mismo. Intente importar filas de 1 billón. Se sorprenderá de la enorme diferencia que hace en términos de rendimiento: ninjabber

@ninjabber Los documentos dice El cliente mysqlimport proporciona una interfaz de línea de comandos para LOAD DATA INFILE, así es teóricamente imposible ofrecer ningún beneficio de rendimiento sobre LOAD DATA INFILE. - Mladen Jablanovic

también necesito --fields-optionally-enclosed-by=\" y `--fields-escaped-by = \` - cadena

La forma más sencilla en la que he importado más de 200 filas es debajo del comando en la ventana phpmyadmin sql

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 una cosa en mente, nunca aparezca, en la segunda columna, de lo contrario su importación se detendrá

Respondido el 11 de junio de 14 a las 19:06

',' -> '\ t', '"' -> '' en el caso de archivos TSV y elimine la última línea si no hay encabezado (espero que los rastreadores de búsqueda indexen esto). Dedos sangrantes

Si es un archivo local, es posible que deba LOAD DATA LOCAL INFILE. Si esto arroja un error 1148 "el comando usado no está permitido", puede habilitarlo ejecutando mysql en la línea de comando con --local-infile. - Gran McLargeEnorme

Recibí el error: ERROR 1045 (28000): Acceso denegado para el usuario 'usuario' @ '%' (usando contraseña: SÍ) - ARUNBALAN NV

Recibo este error: el servidor MySQL se está ejecutando con la opción --secure-file-priv, por lo que no puede ejecutar esta declaración - Agniswar Bakshi

respuesta perfecta solo ejecútalo con LOAD DATA LOCAL INFILE y todo está bien x-magix

Yo se que el la pregunta es vieja, Pero me gustaria comparten este

Usé este método para importar más de 100K registros (~ 5MB) en 0.046sec

Así es como se hace:

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 salta el último campo (MySQL 5.6.17)

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

Entonces, asumiendo que tienes el 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);

respondido 21 mar '18, 15:03

Importé 16k filas y 48 columnas. Gracias amigo. - Renjith VR

Esta es la mejor solución. Para cualquiera que tenga curiosidad sobre lo rápido que es esto: importé 3.2 millones de filas en menos de 14 segundos en una instancia de AWS Lightsail de $ 20 / mes, con el servidor MySQL integrado (no un RDS de alto rendimiento). ¡Impresionante! - master_gracey

En esta línea (field_1,field_2 , field_3); ¿Se refiere a la lista de columnas en un archivo .csv o en una tabla? es decir, ¿cuáles son estos campos? - tera_789

@ tera_789 Los de su archivo csv que probablemente coincidirán con su tabla - Fahad

Debe seguir el formato de datos. ejemplo (para mi caso) first_name, last_name, dob, phone_number, email, name, lastName, 12-05-2018,54545, faiz @ gmail.com, name1, lastName1,2018-05-12,456, faiz1 @ gmail.com, name2, lastName2,2018- 05-12,456, faiz2 @ gmail.com, name3, lastName3,2018-05-22,456, faiz3 @ gmail.com, name4, lastName4,1988-05-22,456, faiz4 @ gmail.com, name5, lastName5,1988-05- 22,456, faiz5 @ gmail.com, nombre6, apellido6,1987-05-21,456, faiz6 @ gmail.com - faiz ahmed

phpMyAdmin puede manejar la importación de CSV. Estos son los pasos:

  1. Prepare el archivo CSV para que los campos estén en el mismo orden que los campos de la tabla MySQL.

  2. Elimine la fila de encabezado del CSV (si corresponde), de modo que solo los datos estén en el archivo.

  3. Vaya a la interfaz phpMyAdmin.

  4. Seleccione la tabla en el menú de la izquierda.

  5. Haga clic en el botón de importación en la parte superior.

  6. Busque el archivo CSV.

  7. Seleccione la opción "CSV usando LOAD DATA".

  8. Introduzca "," en los "campos terminados por".

  9. Ingrese los nombres de las columnas en el mismo orden en que están en la tabla de la base de datos.

  10. Haga clic en el botón Ir y ya está.

Esta es una nota que preparé para mi uso futuro, y la comparto aquí si alguien más puede beneficiarse.

Respondido 28 Jul 16, 05:07

Esto es bueno y sencillo. Prefiero crear tablas y columnas a través de SQL (por lo que omito el paso 9) e insertar datos mediante la importación de CSV. No te olvides de configurar NULL en el CSV para cualquier campo / columna de incremento automático. - plata

Tenga en cuenta que phpMyAdmin falla estrepitosamente cuando se incluyen caracteres cirílicos en el archivo CSV, sin importar que le diga que use utf-8. - Fran Marzoa

No olvide cambiar el tamaño de importación si está importando un archivo CSV grande. Por cierto, no es una buena opción para archivos CSV grandes. - Avi

Esto requiere descargar primero el archivo .csv a un cliente web, ya que no puede buscar un archivo csv local. - mckenzm

Sí, puede, debe marcar la casilla de verificación marcada como 'Palabra clave local' y puede usar un archivo csv local - Chrisfs

Puede solucionar esto enumerando las columnas en su declaración LOAD DATA. Desde el manual:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

... entonces, en su caso, debe enumerar las 99 columnas en el orden en que aparecen en el archivo csv.

Respondido el 29 de diciembre de 14 a las 21:12

Si está utilizando MySQL Workbench (actualmente versión 6.3) puede hacerlo de la siguiente manera:

  1. Haga clic derecho en "Tablas";
  2. Elija el asistente de importación de datos de tabla;
  3. Elija su archivo csv y siga las instrucciones (también se puede usar JSON); Lo bueno es que puede crear una nueva tabla basada en el archivo csv que desea importar o cargar datos en una tabla existente.

enter image description here

contestado el 24 de mayo de 18 a las 13:05

+1. Usé esto porque mysql seguía dándome errores para LOAD DATA INFILE y mysqlimport ("esto no es compatible con esta versión de mysql") - clmno

Este método funciona, pero es algo lento. Pensé que el uso de esta función habría creado una enorme INSERT consulta e intenté hacerlo todo a la vez, pero parece que hacerlo de esta manera en realidad se ejecuta una vez INSERT por fila. - davidelminion

Este método me salvó. Recibía muchos errores con LOAD DATA, pero necesitaba apresurarme. Recomiendo encarecidamente si algún lector tiene problemas con LOAD DATA. - Alejandro Santos

Con Workbench 8.0.22, esta característica está lejos de ser estable. Sigue fallando, importando 0 líneas o simplemente se congela. Lo probé con el CSV COVID-19 de Our World in Data: github.com/owid/covid-19-data/tree/master/public/data - pintoresco

Prueba esto, funcionó para mí

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS aquí ignora la primera fila que contiene los nombres de campo. Tenga en cuenta que para el nombre del archivo debe escribir la ruta absoluta del archivo.

Respondido 16 ago 17, 02:08

Esta es la mejor respuesta. Por que usar una alternativa, herramienta cuando un solo comando SQL es suficiente? - sdgfsdh

¿Sabes cómo hacer que esto funcione cuando intentas cargar el archivo en mysql ejecutándose en un servidor? Me pide acceso denegado al archivo (contraseña). ¿Dónde ingresar la contraseña de la ubicación del archivo csv? - baktaawar

La línea de comandos de mysql es propensa a muchos problemas al importar. Así es como se hace:

  • use excel para editar los nombres de los encabezados para que no tengan espacios
  • guardar como .csv
  • use el navegador Navicat Lite Sql gratuito para importar y crear automáticamente una nueva tabla (asígnele un nombre)
  • abre la nueva tabla inserta una columna de número automático principal para la identificación
  • cambie el tipo de columnas como desee.
  • ¡hecho!

Respondido el 25 de Septiembre de 12 a las 01:09

Veo algo extraño. Estás usando para ESCAPAR el mismo carácter que usas para CERRAR. Entonces, el motor no sabe qué hacer cuando encuentra un '"' y creo que es por eso que nada parece estar en el lugar correcto. Creo que si eliminas la línea de ESCAPING, debería funcionar muy bien. Como:

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

A menos que analices (manualmente, visualmente, ...) tu CSV y encuentres qué personaje usa para escapar. A veces es '\'. Pero si no lo tienes, no lo uses.

Respondido el 17 de diciembre de 18 a las 10:12

Sin embargo, otra solución es utilizar csvsql herramienta de increíble kit csv sucesivamente.

Ejemplo de uso:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

Esta herramienta puede inferir automáticamente los tipos de datos (comportamiento predeterminado), crear una tabla e insertar los datos en la tabla creada. --overwrite La opción se puede utilizar para eliminar la tabla si ya existe. --insert opción: para completar la tabla desde el archivo.

Para instalar la suite

pip install csvkit

Requisitos previos: python-dev, libmysqlclient-dev, MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

Respondido el 21 de junio de 18 a las 15:06

Cómo importar archivos csv a tablas sql

Archivo de ejemplo: Overseas_trade_index archivo CSV de datos

Pasos:

  1. Necesito crear una mesa para overseas_trade_index.

  2. Necesita crear columnas relacionadas con el archivo csv.

    Consulta SQL:

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
    
  3. Necesita conectar la base de datos mysql en la terminal.

    =>show databases;
    =>use database;
    =>show tables;
    
  4. Ingrese este comando para importar los datos csv a tablas mysql.

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
    
  5. Encuentre estos datos del índice de comercio exterior en sqldatabase:

    select * from trade_index;
    

Respondido el 09 de junio de 19 a las 21:06

Si está utilizando una máquina con Windows con una hoja de cálculo de Excel cargada, el nuevo complemento mySql para Excel es fenomenal. La gente de Oracle realmente hizo un buen trabajo con ese software. Puede realizar la conexión a la base de datos directamente desde Excel. Ese complemento analizará sus datos y configurará las tablas por usted en un formato consistente con los datos. Tenía algunos archivos csv de datos monstruosos para convertir. Esta herramienta fue un gran ahorro de tiempo.

http://dev.mysql.com/downloads/windows/excel/

Puede realizar actualizaciones desde Excel que se completarán en la base de datos en línea. Esto funcionó muy bien con los archivos mySql creados en un alojamiento compartido ultra económico de GoDaddy. (Tenga en cuenta que cuando crea la tabla en GoDaddy, debe seleccionar algunas configuraciones fuera de los estándares para habilitar el acceso fuera del sitio de la base de datos ...)

Con este complemento, tiene una interactividad pura entre su hoja de cálculo XL y el almacenamiento de datos mySql en línea.

Respondido el 23 de diciembre de 14 a las 09:12

respondido 14 nov., 18:23

Utilizo mysql workbench para hacer el mismo trabajo.

  1. crear nuevo esquema
  2. abrir esquema recién creado
  3. haga clic derecho en "Tablas" y seleccione "Asistente de importación de datos de tabla"
  4. proporcione la ruta del archivo csv y el nombre de la tabla y finalmente configure su tipo de columna porque el asistente establece el tipo de columna predeterminado en función de sus valores.

Nota: eche un vistazo al archivo de registro de mysql workbench en busca de errores usando "tail -f [mysqlworkbenchpath] /log/wb*.log"

respondido 01 mar '19, 03:03

Muchas gracias por su respuesta, siendo nuevo en MySQL, no sabía nada de esto, me ayudó con CSV. Ahora, también necesito importar 10 tablas desde Access: ¿cree que la forma más sencilla será exportar estas tablas a Excel, de Excel a CSV y luego seguir estos pasos? - Naomi

Descubrí que este método no importa todas las filas :( De 5,342 filas, solo importó 2,485 filas para mí. ¿Por qué eso? - Naomi

Hola Naomi, si revisas el registro de mysqlworkbench, te mostrará por qué dejó de importar datos. Es posible que tenga algunos valores nulos o un tipo de discrepancia en su archivo de base de datos y CSV. Pero recomiendo encarecidamente seguir la respuesta de Juan (justo después de mí). Su solución es mejor y más limpia que yo. - Mehdi

Aquí hay una captura de pantalla de archivo de Excel de muestra:

enter image description here

Guarde como y elija .csv.

Y tendrá la captura de pantalla de datos .csv que se muestra a continuación si abre con notepad ++ o cualquier otro bloc de notas.

enter image description here

Asegúrese de eliminar el encabezado y alinear las columnas en .csv como en la tabla mysql. Reemplaza folder_name por el nombre de tu carpeta

CARGAR DATOS LOCAL INFILE
'D: /folder_name/myfilename.csv' INTO TABLE mail CAMPOS TERMINADOS POR ',' (fname, lname, email, phone);

Si es big data, ¡puede tomar café y cargarlo !.

Eso es todo lo que necesitas.

respondido 31 mar '17, 12:03

Consulta PHP para importar un archivo csv a una base de datos mysql

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

** Datos de archivo CSV de muestra **

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus

respondido 29 nov., 16:07

Cambie el nombre del servidor, el nombre de usuario, la contraseña, el nombre de la base de datos, la ruta de su archivo, el nombre de la tabla y el campo que está en su base de datos que desea insertar

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>

Respondido el 13 de junio de 17 a las 07:06

Lo hice de manera simple usando phpmyadmin. Seguí los pasos de @Farhan, pero todos los datos se eliminaron en una sola columna. Como lo hice:

  1. Creó un archivo CSV y eliminó la fila del encabezado con los nombres de las columnas. Conservé solo datos.
  2. Creé una tabla con nombres de columna que coinciden con las columnas csv.
  3. Recuerde asignar los tipos adecuados a cada columna.
  4. Acabo de seleccionar la importación y fui a la pestaña de importación.
  5. En la exploración, seleccioné el archivo CSV y mantuve todas las opciones como están.
  6. Para mi sorpresa, todos los datos se importaron correctamente en sus columnas correspondientes.

Respondido 04 Jul 20, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.