Blog de Gonzalo

CARGAR DATOS EN MYSQL DESDE UN FICHERO

Mysql permite cargar datos a una tabla desde un fichero con la instrucción LOAD DATA INFILE que sirve para tomar cualquier archivo separado por comas, los famosos csv, aunque no necesariamente tienen que ser ',', puede ser otro carácter, es más, es aconsejable, ya que si hay un campo de tipo como comentario puede tener ',' y provocar problemas. La sintaxis básica es:


LOAD DATA LOCAL INFILE '/fichero.csv'
INTO TABLE test_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(campo1, campo2, campo3,...,campoN);
  • LOAD DATA indica que debe cargar un archivo csv si se pone la opción LOCAL indica que el archivo esta en nuestro ordenador y que debe ser procesado por el cliente y enviado al servidor sino, la ruta (absoluta o relativa) es en el servidor. Si dentro de la tabla hay registros, la violación de primary keys podrí­a causar la detención de la carga, entonces es mejor las opciones IGNORE (ignora las filas que violen el constraint y no las inserta) o REPLACE (agrega las filas reemplazando las existentes). Ejemplo:
    
    LOAD DATA LOCAL INFILE 'ruta_archivo'
    REPLACE INTO TABLE 'nombre de la tabla'
    
  • Para establecer el juego de caracteres se hace con lo siguiente: CHARACTER SET latin1.
  • Como se ha comentado antes es mejor usar otro carácter que la ',' para separar los campos. Para indicar que carácter se está usando para separar los campos se hace así: FIELDS TERMINATED BY ‘;’, en este caso el ';'.
  • También pueden indicar el carácter con que están delimitadas las cadenas, si comillas simples, dobles, numerales (#), etc... : «campo1»; «campo2»; «campo3»; … Hay que usar FIELDS ENCLOSED BY '#'. Se puede agregar OPTIONALLY para indicar que algunos campos están delimitados con ciertos caracteres, pero no todos.
  • Se pueden ignorar líneas, por ejemplo la primera que es donde viene los nombres de los campos. Sería: IGNORE 1 LINES (campo1, campo2, campo3, campo4)
Hay más opciones pero espero que con esto sirva para empezar. Un ejemplo final sería:

LOAD DATA LOCAL INFILE 'fichero.csv'
IGNORE
FIELDS TERMINATED BY ';' ENCLOSED BY '#'
LINES STARTING BY » TERMINATES BY »
IGNORE 1 LINES
(campo1, campo2, campo3, @campo4)
SET campo4= (SQL aplicado al @field4)

Compartir en twitter