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

306

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 correcto. 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 (representado 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 borrones 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 databazse. Puedo cargar el archivo en OpenOffice sin ningún problema.

El archivo clientdata.csv contiene 2593 líneas y 570 registros. La primera línea contiene nombres de columna. Creo que está delimitado por comas, y el texto aparentemente está delimitado con 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 era 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.

Iain Samuel McLean Anciano
fuente
17
Y si estás en OSX Sequel Pro tiene una herramienta de importación increíble y es GRATIS ;-)
Merrick
41
Es sorprendente para mí que el póster original haya respondido a su propia pregunta mejor que nadie ... No sé por qué tanta gente está tan lista para dar recomendaciones de software cuando hay un comando SQL existente, que puede ser programático en lugar de UI -establecido. No conozco a nadie más, pero programático 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.
Chris Cirefice
@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 programáticamente.
AlexC
@Merrick esto funcionó de maravilla en osx
weaveoftheride
Escribí un extenso tutorial para cargar datos csv en mysql junto con una herramienta generadora de sintaxis en Excel .
mysql_user

Respuestas:

133

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

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

Mi favorito para el trabajo es HeidiSQL basado en Windows . Te da una interfaz gráfica para construir el LOAD DATAcomando; puedes reutilizarlo programáticamente más tarde.

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
fuente
25
Para Mac OSX, use Sequel Pro.
Agi Hammerthief
3
Acabo de probarlo y me obliga a crear la tabla primero ... en lugar de usar los nombres de columna.
Dominique el
3
Debe seleccionar una tabla antes de poder continuar ... y dado que el punto no es tener que hacer la tabla ...
Dominique
3
Tenga en cuenta que en Linux, HeidiSQL funciona muy bien en Wine.
AlejandroVD
1
@Paul, el punto de la respuesta es que las herramientas de la GUI pueden facilitar la coincidencia de las columnas de importación con las columnas de la tabla.
Pekka
191

Use 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 hacer que el delimitador sea una pestaña, use --fields-terminated-by='\t'

michalzuber
fuente
66
mysqlimportutiliza LOAD DATA INFILE...detrás de escena, por lo que es más o menos lo mismo.
Mladen Jablanović
8
Al igual que con LOAD DATA INFILE, debe crear una tabla antes de poder usar mysqlimport.
Marcus Downing
@ MladenJablanović, definitivamente no es lo mismo. Intenta importar 1bil filas. Te sorprenderá la gran diferencia que hace en términos de rendimiento
ninjabber
@ninjabber Los documentos dicen que el cliente mysqlimport proporciona una interfaz de línea de comandos para LOAD DATA INFILE , por lo que es teóricamente imposible ofrecer algún beneficio de rendimiento LOAD DATA INFILE.
Mladen Jablanović
1
también necesita --fields-optionally-enclosed-by=\"y `--fields-escaped-by = \`
chaintng
80

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

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

aquí hay 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 su importación se detendrá

Temerario
fuente
1
'' -> '\ t', '"' -> '' en el caso de los archivos TSV y eliminar la última línea si (índice de esperanza de búsqueda rastreadores esto) sin cabecera..
Sangrado dedos
16
Si es un archivo local, es posible que deba hacerlo 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.
Big McLargeHuge
recibí el error: ERROR 1045 (28000): acceso denegado para el usuario 'usuario' @ '%' (usando la contraseña: SÍ)
ARUNBALAN NV
Debe otorgar todo el acceso al usuario, desde el panel de administración, intente importar el script.
DareDevil
1
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
66

Sé que la pregunta es antigua , pero me gustaría compartir esto

Utilicé este método para importar más de 100K 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 omite el último campo (MySQL 5.6.17)

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

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

IGNORE 1 ROWS

Esto es lo que parece 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
fuente
Importé 16k filas y 48 columnas. Gracias amigo.
Renjith VR
Esta es la mejor solución. Para cualquier persona curiosa que tan rápido sea 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). ¡Increíble!
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, ¿qué son estos campos?
tera_789
@ tera_789 Los que están en su archivo csv que probablemente coincidan con su mesa
Fahad
Debe seguir el formato de datos. ejemplo (para mi caso) <pre> 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, name6, lastName6,1987-05-21,456, faiz6 @ gmail.com </pre>
Faiz Ahmed
32

phpMyAdmin puede manejar la importación CSV. Aquí están 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 del 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. Haz clic en el botón Importar en la parte superior.

  6. Busque el archivo CSV.

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

  8. Ingrese "," 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 compartir aquí si alguien más puede beneficiarse.

Farhan
fuente
Esto es bueno y simple. 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 olvide establecer NULLen el CSV cualquier campo / columna de incremento automático.
plata
Tenga en cuenta que phpMyAdmin falla miserablemente cuando los caracteres cirílicos se incluyen 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 marcada 'Palabra clave local' y puede usar un archivo csv local
chrisfs
12

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

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

... así que en su caso debe enumerar las 99 columnas en el orden en que aparecen en el archivo csv.

Lafncow
fuente
8

Intenta 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 de archivo debe escribir la ruta absoluta del archivo.

David
fuente
Esta es la mejor respuesta. ¿Por qué usar otra herramienta cuando un solo comando SQL servirá?
sdgfsdh
¿Sabe cómo hacer que esto funcione cuando intenta cargar el archivo en mysql que se ejecuta en un servidor? Me pide acceso denegado para el archivo (contraseña). ¿Dónde ingresar la contraseña de la ubicación del archivo csv?
Baktaawar
7

La línea de comando mysql es propensa a demasiados problemas en la importación. Así es como lo haces:

  • use Excel para editar los nombres de encabezado para no tener espacios
  • guardar como .csv
  • use el navegador gratuito Navicat Lite Sql para importar y crear automáticamente una nueva tabla (asígnele un nombre)
  • abra la nueva tabla inserte una columna de número automático principal para ID
  • cambie el tipo de las columnas como lo desee.
  • ¡hecho!
usuario1464271
fuente
5

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

  1. Haga clic derecho en "Tablas";
  2. Asistente de importación de datos de tabla elegida;
  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

ingrese la descripción de la imagen aquí

Vitaliy Pak
fuente
+1. LOAD DATA INFILEmysqlimport
Usé
Este método funciona, pero es un poco lento. Pensé que el uso de esta función habría generado una INSERTconsulta masiva e intentado hacerlo todo de una vez, pero parece que hacerlo de esta manera en realidad se ejecuta una vez INSERTpor fila.
DaveTheMinion
4

Veo algo extraño Estás usando para ESCAPAR el mismo carácter que usas para ENCERRAR. Por lo tanto, 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 elimina la línea de ESCAPE, debería funcionar muy bien.

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 analice (manualmente, visualmente, ...) su CSV y encuentre qué personaje usa para escapar. A veces es '\'. Pero si no lo tiene, no lo use.

Juan
fuente
3

Otra solución es utilizar la herramienta csvsql de la increíble suite csvkit .

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. --overwriteLa opción se puede utilizar para descartar la tabla si ya existe.--insertopción: para llenar la tabla del 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
ruvim
fuente
3

Cómo importar archivos csv a tablas sql

Archivo de ejemplo: Overseas_trade_index CSV de datos

Pasos:

  1. Necesito crear una tabla 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 las 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;
sivamani
fuente
2

Si está utilizando una máquina Windows con una hoja de cálculo Excel cargada, el nuevo complemento mySql para Excel es fenomenal. La gente de Oracle realmente hizo un buen trabajo con ese software. Puede hacer la conexión de la base de datos directamente desde Excel. Ese complemento analizará sus datos y configurará las tablas para usted en un formato consistente con los datos. Tenía algunos archivos de datos csv 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ó extremadamente bien con los archivos mySql creados en el alojamiento compartido GoDaddy ultra económico. (Tenga en cuenta que cuando cree la tabla en GoDaddy, debe seleccionar algunas configuraciones no estándar para permitir 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.

zipzit
fuente
2

Yo uso mysql workbench para hacer el mismo trabajo.

  1. crear nuevo esquema
  2. abrir esquema creado recientemente
  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 estableció 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 utilizando "tail -f [mysqlworkbenchpath] /log/wb*.log"

Mehdi
fuente
Muchas gracias por su respuesta, siendo nuevo en MySQL que no sabía sobre esto, me ayudó con CSV. Ahora, también necesito importar 10 tablas de 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 DB y CSV. Pero recomiendo seguir la respuesta de Juan (justo después de mí). Su solución es mejor y más limpia que yo.
Mehdi
1

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

ingrese la descripción de la imagen aquí

Guardar como y elegir .csv.

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

ingrese la descripción de la imagen aquí

Asegúrese de eliminar el encabezado y tener una alineación de columna en .csv como en la tabla mysql. Reemplace folder_name por su nombre de carpeta

CARGAR DATOS LOCAL INFILE
'D: /folder_name/myfilename.csv' EN LA TABLA CAMPOS DE CORREO TERMINADOS POR ',' (fname, lname, correo electrónico, teléfono);

Si es un gran dato, ¡puede tomar café y cargarlo!

Eso es todo lo que necesitas.

Magige Daniel
fuente
0

Consulta PHP para importar archivos csv a la 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
Suwarnakumar Kanapathipillai
fuente
0

Cambie el nombre del servidor, el nombre de usuario, la contraseña, el nombre de 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>'
       }
    ?>
Srikrushna
fuente