Importación masiva de archivos csv a base de datos MySql. -
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