Cómo importar 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 que pueda refactorizar en un formato cuerdo. 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 (representados 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 tabla está llena de NULL.

Creo que el problema es que los blurbs 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.

Los datos del cliente.el archivo 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 por doublequote.

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 a la declaración LOAD DATA que OpenOffice fue lo suficientemente inteligente como 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 un montón de registros completamente NULL, y ninguno de los datos que se cargaron parece estar en el lugar correcto.

Author: dreftymac, 2010-09-03

15 answers

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

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

Mi favorito para el trabajo es basado en Windows HeidiSQL. Le da una interfaz gráfica para construir el comando LOAD DATA; puede reutilizarlo programáticamente más tarde.

Importar archivo de texto

Captura de pantalla: Diálogo" Importar archivo de texto "

Para abrir la importación diálogo "textfile", vaya a Tools > Import CSV file:

introduzca la descripción de la imagen aquí

 112
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-24 19:20:42

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 del delimitador una pestaña, use --fields-terminated-by='\t'

 156
Author: michalzuber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-16 22:59:46

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

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

Aquí está .datos csv ARCHIVO CSV

Aquí está la orden:

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á

 68
Author: DareDevil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-11 18:37:03

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

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

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

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

Entonces, asumiendo que tienes la primera fila como el título para tus 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);
 42
Author: Fahad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-21 15:56:27

PhpMyAdmin puede manejar la importación 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 la hay), 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 importar en la parte superior.

  6. Ir al CSV file.

  7. Seleccione la opción "CSV usando DATOS DE CARGA".

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

  9. Introduzca los nombres de las columnas en el mismo orden que en la tabla de la base de datos.

  10. Haga clic en el botón ir y listo.

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

 19
Author: Farhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-28 04:13:09

Puede arreglar esto listando las columnas en la instrucción LOAD DATA. Del manual :

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

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

 10
Author: lafncow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-29 21:38:26

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

  • use excel para editar los nombres de los encabezados para que no tengan espacios
  • guardar como .csv
  • utilice el navegador Sql gratuito Navicat Lite para importar y crear automáticamente una nueva tabla (darle un nombre)
  • abrir la nueva tabla insertar una columna principal de número automático para ID
  • cambie el tipo de las columnas como desee.
  • hecho!
 7
Author: user1464271,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-25 00:53:44

Prueba esto, funcionó para mí

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

IGNORAR 1 FILAS 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.

 3
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-16 01:44:25

También puede probar esta herramienta en línea para generar sentencias SQL create/insert basadas en su CSV. http://www.convertcsvtomysql.com /

Lo que me gusta de esta herramienta:

  • Simple
  • No solo genera instrucciones INSERT, sino que también crea instrucciones para generar una tabla
  • Al generar instrucciones CREATE, esta herramienta no solo hace que todos los campos VARCHAR-analiza los datos en su CSV, y en función de ese análisis, elige los datos adecuados tipo.

Desventajas

  • El tamaño del archivo de entrada está limitado a 3mb
  • Es posible que no esté dispuesto a regalar sus datos a algún tercero
 2
Author: Ievgen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-13 16:51:18

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

  1. Haga clic derecho en "Tablas";
  2. Eligió Asistente para 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

introduzca la descripción de la imagen aquí

 2
Author: Vitaliy Pak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-24 12:51:25

Si está utilizando una máquina windows con una hoja de cálculo Excel cargada, el nuevo plugin MySQL para Excel es fenomenal. La gente de Oracle realmente hizo un buen trabajo en ese software. Puede hacer la conexión a la base de datos directamente desde Excel. Ese plugin analizará sus datos y configurará las tablas para usted en un formato consistente con los datos. Tenía algunos enormes archivos csv de datos 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 el alojamiento compartido GoDaddy ultra económico. (Nota: al crear la tabla en GoDaddy, debe seleccionar algunas configuraciones fuera de estándar para habilitar el acceso fuera del sitio a la base de datos...)

Con este plugin tienes pura interactividad entre tu hoja de cálculo XL y MySQL en línea almacenamiento de datos.

 1
Author: zipzit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-23 09:07:47

Cambie servername,username, password,dbname,path of your file, tablename and the field which is in your database you want to insert

<?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>'
       }
    ?>
 1
Author: Srikrushna Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 06:54:26

Consulta PHP para importar archivo 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,[email protected]
Brandon Wilson,541-309-5149,[email protected]
Craig White,516-795-8065,[email protected]
David Whitney,713-214-3966,[email protected]
 0
Author: Suwarnakumar Kanapathipillai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-29 07:05:28

Aquí está la captura de pantalla del archivo de excel de muestra:

introduzca la descripción de la imagen aquí

Guardar como y elegir .csv.

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

introduzca la descripción de la imagen aquí

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

CARGA DE DATOS LOCAL INFILE
'D:/folder_name/myfilename.csv" EN EL correo DE LA TABLA CAMPO TERMINADO POR"," (fname, lname, correo electrónico, teléfono);

Si big data, puede tomar café y tenerlo cargado!.

Eso es todo lo que necesitas.

 0
Author: Magige Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-31 11:01:25

Otra solución es usar la herramienta csvsql de amazing csvkit suite.

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 tabla e insertar los datos en la tabla creada. la opción --overwrite se puede usar para soltar la tabla si ya existe. --insert opción - para rellenar 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
 0
Author: ruvim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 14:15:20