Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Aporte:  Importación masiva de archivos csv a base de datos MySql.
#1
Saludos.

Hay bases de datos públicas las cuales te las puedes bajar, por ejemplo el INE (Instituto Nacional de Estadística), y trabajar con ellas y hacer diversos estudios. Lo malo es que para trabajar con estos datos, por lo general, necesitas programas de pago y que sólo funcionan bajo windows. Pero también te dan la opción de bajártelos en formato csv y así poder importarlos a base de datos MySql.

Me surgió la pega de que al ser bases de datos muy grandes el gestor de MySql, phpmyadmin, no puede con ellas, da errores múltiples, de tiempo de ejecución, etc, y después de hacer varias configuraciónes en php.ini seguía sin poder importarlas.

Encontré por la red un script en bash para hacer esa importación masiva (mérito a su autor), pero me seguía fallando y le hice unos "retoques" y ahora me funciona de maravilla. En el script hay que poner el nombre de la base de datos que has creado previamente (ten en cuenta que vas a importar tablas), el usuario de la base de datos, la contraseña y la ruta del directorio donde están los archivos csv, ya sea un archivo o varios, te creará una tabla por cada archivo que haya.

Aquí el script:

Código:
#!/bin/bash


# By brian@brianyoungblood.com to keep original files and import based on tab delimited data
# orginal script based on work from Eric London. http://ericlondon.com/bash-shell-script-import-large-number-csv-files-mysql

# show commands being executed, per debug
#set -x

# define database connectivity
_db="nombre_bade_de_datos"
_db_user="usuario"
_db_password="contraseña"

# define directory containing CSV files
_csv_directory="/directorio/donde/estan/csv"

# go into directory
cd $_csv_directory

# get a list of CSV files in directory
_csv_files=`ls -1 *.csv`

# loop through csv files
for _csv_file in ${_csv_files[@]}
do

# remove file extension
_csv_file_extensionless=`echo $_csv_file | sed 's/\(.*\)\..*/\1/'`

# define table name
_table_name="${_csv_file_extensionless}"

# get header columns from CSV file, creándola como un array
_header_columns=(`head -1 $_csv_directory/$_csv_file | tr ',' '\n' | sed 's/^"//' | sed 's/"$//' | sed 's/ /_/g'`)
# Crea un array con los datos de la segunda fila
_header_columns_numero_texto=(`head -2 $_csv_directory/$_csv_file | tail -1 | tr ',' '\n' | sed 's/^"//' | sed 's/"$//' | sed 's/ /_/g'`)
_header_columns_string=`head -1 $_csv_directory/$_csv_file | sed 's/ /_/g' | sed 's/"//g'`
echo "header============>${_header_columns[@]}"
echo "header============>$_header_columns_string"
# ensure table exists
mysql -u $_db_user -p$_db_password $_db << eof
CREATE TABLE IF NOT EXISTS \`$_table_name\` (
id int(11) NOT NULL auto_increment,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE utf8_spanish2_ci
eof
# Se hace un bucle for con el numero de campos, si el dato de la segunda fila es numerico o texto asi crea el campo
for (( c=0; c<${#_header_columns[@]}; c++ ))
do
if [[ ${_header_columns_numero_texto[$c]} =~ [[:alpha:]] ]] ; then
mysql -u $_db_user -p$_db_password $_db --execute="alter table $_table_name add column ${_header_columns[$c]} text"
else
mysql -u $_db_user -p$_db_password $_db --execute="alter table $_table_name add column ${_header_columns[$c]} Float"
fi
done


# import csv into mysql
mysqlimport --local --ignore-lines=1 --fields-enclosed-by='"' --fields-terminated-by=',' --lines-terminated-by="\n" --columns=$_header_columns_string -u $_db_user -p$_db_password $_db $_csv_directory/$_csv_file

done
exit


Edito: He mejorado un poco el script. Antes creaba todos los campos tipo texto.... ahora detecta si los datos son texto o numero y así los crea.


Bueno, espero que a alguien le sirva y le funcione bien.


Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)