2010-09-03 22 views
198

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 a 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 era una tarea bastante difícil en sí mismo:Cómo importar archivos CSV a la tabla MySQL

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 están sobre la mesa, y todos los campos de bodega (256) valores VARCHAR, excepto las columnas que contienen los recuentos (representado por INT), sí/no (representado por BIT), precios (representados por DECIMAL) y borrones de texto (representados por TEXT).

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    | 
... 

El conjunto de 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 línea nueva 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 una doble cita.

ACTUALIZACIÓN:

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

he añadido algo de información para la declaración LOAD DATA que OpenOffice era lo suficientemente inteligente como para inferir, y ahora se 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 quedó cargado parece estar en el lugar correcto.

+9

Y si está en OSX [Sequel Pro] (http://www.sequelpro.com/) tiene una herramienta de importación impresionante y es ** GRATIS ** ;-) – Merrick

+18

Me sorprende que el póster original respondió su propia pregunta mejor que nadie ... No sé por qué tanta gente está tan dispuesta a dar recomendaciones de software cuando hay un comando SQL existente, que puede ser * programático * en lugar de basado en la interfaz de usuario. No sé de nadie más, pero programático significa para mí que puedo tener secuencias de comandos configuradas para importar automáticamente archivos en marcas de tiempo, mientras que la basada en la interfaz de usuario es puramente manual. –

+0

@ChrisCirefice: Creo que la respuesta aceptada lo explica bien. Necesitaba ayuda para crear manualmente el comando 'cargar datos', 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

Respuesta

101

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

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

Import textfile

Screenshot: "Import textfile" dialog

Para abrir la importación de archivo de texto" de diálogo, vaya a Tools > Import CSV file:. Línea de comandos

enter image description here

+14

Para Mac OSX, use Sequel Pro. –

+2

Acabo de probarlo y me obliga a crear primero la tabla ... en lugar de utilizar los nombres de las columnas. – Dominique

+0

@Dominique eso no debería suceder. ¿Qué mensaje estás recibiendo exactamente? ¿Estás viendo las columnas de la primera línea en el archivo CSV en el cuadro de diálogo de importación? –

7

El MySQL es propenso a demasiados problemas en la importación Aquí está cómo lo haces:

  • use excel para editar los nombres de los encabezados para no tener espacios
  • guardar como.csv
  • uso gratuito navegador Navicat Lite SQL para importar y crear automáticamente una nueva tabla (darle un nombre)
  • abrir la nueva tabla de insertar una columna automática de números primaria para la identificación
  • el cambio del tipo de las columnas según se desee .
  • hecho!
132

Uso 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 el delimitador de una ficha, utilice --fields-terminated-by='\t'

+2

'mysqlimport' usa' LOAD DATA INFILE ... 'detrás de escena, por lo que es más o menos lo mismo. –

+3

Al igual que con 'LOAD DATA INFILE', necesita crear una tabla antes de poder usar' mysqlimport'. –

+0

@ MladenJablanović, definitivamente no es lo mismo. Intente importar filas de 1bil. Te sorprenderá la enorme diferencia que hace en términos de rendimiento – ninjabber

2

También podría intentar esto herramienta en línea para generar instrucciones SQL create/insert basadas en su CSV. http://www.convertcsvtomysql.com/

Lo que me gusta de esta herramienta:

  • simple
  • No sólo genera instrucciones INSERT, sino también las instrucciones CREATE para generar una tabla
  • Al generar las instrucciones CREATE, esta herramienta no simplemente hace todos los campos VARCHAR - analiza los datos en su CSV y, basándose en ese análisis, elige el tipo de datos adecuado.

Desventajas

  • tamaño del archivo de entrada está limitada a 3 mb
  • Es posible que no están dispuestos a ceder sus datos a algún tercero
+2

[SQL Fiddle] (http://sqlfiddle.com/) también lo hace. el motor de base de datos a MySQL, haga clic en "Texto a DDL", pegue el contenido CSV en el cuadro de diálogo y haga clic en "Añadir a DDL". El panel DDL contendrá una instrucción CREATE TABLE y una instrucción INSERT VALUES. , todos los datos permanecen en su navegador web. No lo he probado en archivos CSV grandes. –

+0

muy buen sitio, ya que genera múltiples niveles de INSERT startement que es totalmente personalizable y infalible para la inserción de datos en comparación con la importación de CSV. –

+0

Esa herramienta parece tener muchos problemas con las comillas escapadas, y adivinar automáticamente el separador. Realmente necesita una forma de decir lo que es el separador CSV, y respetar los caracteres separadores escapados. –

16

phpMyAdmin puede manejar CSV importar. Estos son los pasos:

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

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

  3. Ir 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. Examine 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 se encuentran 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 que comparto aquí si alguien más puede beneficiarse.

+0

Esto es bueno y simple. Prefiero crear tablas y columnas vía SQL (así que omito el paso # 9) e insertando datos mediante la importación de CSV. No olvides configurar 'NULL' en el CSV para cualquier campo/columna de incremento automático. – silver

+0

Tenga en cuenta que phpMyAdmin falla miserablemente cuando los caracteres cirílicos se incluyen en el archivo CSV, sin importar si le dice que use utf-8. –

+0

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 grandes archivos CSV. – Avi

59

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

tengo una sencilla tabla de país con dos columnas CountryId, countryName

aquí son datos .csv CSV FILE

aquí es comando:

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

Mantener una cosa en mente, nunca aparecen, en la segunda columna, de lo contrario su importación se detendrá

+1

',' -> '\ 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) –

+10

Si es un archivo local, es posible que necesite para 'CARGAR DATOS INFILE LOCAL '. Si esto arroja un error 1148" comando usado no está permitido ", puede habilitarlo ejecutando mysql en la línea de comando con' --local-infile'. –

+0

me sale el error: ERROR 1045 (28000): Acceso denegado para el usuario 'usuario' @ '%' (usando la contraseña: SÍ) –

1

Si está utilizando una máquina de Windows con la hoja de cálculo de Excel cargada, el nuevo complemento mySql para Excel es fenomenal. La gente de Oracle realmente hizo un buen trabajo en ese software. Puede hacer la conexión de la base de datos directamente desde Excel. Ese complemento analizará sus datos y configurará las tablas en un formato coherente con los datos. Tenía algunos monstruos grandes 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 dentro de Excel que poblarán a la base de datos en línea. Esto funcionó muy bien con los archivos mySql creados en el alojamiento compartido GoDaddy ultra económico. (Tenga en cuenta que cuando crea la tabla en GoDaddy, tiene que seleccionar algunas configuraciones fuera de estándar para habilitar el acceso fuera del sitio de la base de datos ...)

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

10

Puede solucionar esto al enumerar las columnas en la instrucción LOAD DATA. Desde el manual:

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

... por lo que en el caso de que necesite una lista de las 99 columnas en el orden en el que aparecen en el archivo csv.

0

PHP Consulta para Importar archivo CSV a MySQL base de datos

$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)); 
    } 

** Muestra datos del archivo CSV **

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] 
21

I know that the question is old, But I would like to share this

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

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 usted 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, suponiendo que tiene la primera fila como el título para sus campos, es posible que desee incluir esta línea también

IGNORE 1 ROWS; 

Saludos

+0

Importé 16k filas y 48 columnas. Gracias, amigo –

-1

A continuación se muestra excel captura de pantalla de archivo:

enter image description here

Guardar como y elija .csv.

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

enter image description here

Asegúrese de quitar la cabecera y tener una alineación columna en .csv que en la tabla de MySQL. Reemplazar nombre_carpeta por el nombre de la carpeta

LOAD DATA LOCAL INFILE
'D: /folder_name/myfilename.csv' EN electrónico TABLA CAMPOS terminados en '', (fname, lname, correo electrónico, teléfono);

¡Si hay datos grandes, puede tomar café y cargarlo !.

Eso es todo lo que necesita.

+0

Puede leer las instrucciones. [Import CSV codeigniter] (http: // www.twotutorial.com/2016/03/how-to-import-csv- file-in-mysql-using.html), espero que esto te ayude. – NomanJaved

1

Change 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

Prueba de esto, que trabajó para mí

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

IGNORE 1 filas aquí hace caso omiso de 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.

Cuestiones relacionadas