Convertitore csv mysql

Descrizione

Converte un file csv (comma separated values), preventivamente ottenuto da un foglio elettronico, in una tabella mysql. AVVERTENZE: Prima di operare la conversione a .csv di un foglio elettronico, è bene operare alcune modifiche sullo stesso, che valgono universalmente (indipendentemente, quindi, dall'azione specifica dello script):

  • il foglio dovrebbe essere strutturato come un database;
  • non devono esserci celle unite;
  • non devono esserci righe saltate, con titoli o roba simile;
  • dopo essersi annotate le etichette, togliere la riga delle intestazioni.

PRIMA DI LANCIARE LO SCRIPT, INSERIRE NELLO STESSO LE CREDENZIALI MYSQL!

Download

http://www.slacky.eu/misto/concorso/ninobi/csv2mysql
http://www.slacky.eu/misto/concorso/ninobi/csv2mysql.php

Script csv2mysql

#!/bin/sh
#
#  csv2mysql 0.7.10.4 - php-aid
#  ----------------------------
#  converte un file csv (comma separated values), preventivamente
#+ ottenuto da un foglio elettronico, in una tabella mysql.
#  ----------------------------
#  ninobi (Antonino Branca) - aschenaz@gmail.com
#  2007 - copyleft
#
#################### CONFIGURAZIONE DELLO SCRIPT #########################
#
# CONFIGURAZIONE MYSQL (OBBLIGATORIA)
#
HO="localhost"  # host mysql
US=""           # utente mysql
PAW=''          # password mysql
# -------------------------------------------------------------
# CONFIGURAZIONE CAMPO IDENTIFICATIVO TABELLA (FACOLTATIVA)
#
IDEN="ID mediumint(8)"
#--------------------------------------------------------------
# CONFIGURAZIONE TIPI CAMPO MYSQL (FACOLTATIVA)
# puoi aggiungerne altri, facendo attenzione alla sintassi...
#
TIPI=( 'tinyint(3) unsigned' 'mediumint(8) unsigned' 'decimal(8,2) unsigned' 'varchar(255)' 'text' )
#
####################### FINE CONFIGURAZIONE ##############################
if [ $# -lt 3 ]; then
	echo "*********************************************************"
	echo "*                                                       *"
	echo "*                 Mancano parametri!                    *"
	echo "*                                                       *"
	echo "*                Devi lanciarlo così:                   *"
	echo "*                                                       *"
	echo "*   ./csv2mysql nomedatabase nometabella nomefilecsv    *"
	echo "*                                                       *"
	echo "*********************************************************"
	exit 1
fi
DAB="$1"
INDIR="$PWD"
FILECSV="$INDIR/$3"
MYOPDIR=".csv2mysql"
INIFS="$IFS"
#
cd $HOME
if [[ $HO = ""  ||  $US = ""  ||  $DAB = "" ]]; then
	echo "*********************************************"
	echo "*      Devi prima configurare lo script     *"
	echo "*         inserendo i dati di mysql...      *"
	echo "*********************************************"
	cd $INDIR
	exit 1
fi
#
echo "**************************************************************************"
echo
echo "csv2mysql - Partecipante al I concorso di bash-scripting - Slacky.eu 2007"
echo "-------------------------------------------------------------------------"
echo "Questo script permette una semplice conversione di un file .csv (comma"
echo "separated values), preventivamente ottenuto da un foglio elettronico, in"
echo "una tabella mysql, che e' anche possibile creare adesso al volo."
echo 
echo "Per quanto riguarda il foglio elettronico, ricorda: tutte le righe devono"
echo "essere omogenee (niente righe saltate o irregolari, niente celle unite)"
echo "e la riga delle intestazioni DEVE essere tolta (ricordandosi di annmotare"
echo "le voci da inserire eventualmente come campi della tabella)."
echo
echo "**************************************************************************"
echo
read -p "La tabella $2 esiste già nel database $1? (s/n) ==> " SN1
if [[ $SN1 != "s" &&  $SN1 != "n" ]]; then
	echo "Devi rispondere o 's' o 'n'..."
	cd $INDIR
	exit 1
elif [ $SN1 = "n" ]; then
	echo "-----------------------------------------------------------------------"
	echo "                       La creiamo adesso?"
	echo "      Considera. pero' che la procedura è necessariamente scarna"
	echo "       e ci sono alcune limitazioni in merito ai tipi di campo."
	echo "   Puoi comunque aggiungere tipi nella configurazione dello script."
	echo "-----------------------------------------------------------------------"
	echo
	read -p "Risposta (s/n) ==> " SN2
	if [ $SN2 = "n" ]; then
		echo "-----------------------------"
		echo "Allora crea prima la tabella!"
		echo "Arrivederci"
		echo "-----------------------------"
		cd $INDIR
		exit 1
	elif [ $SN2 = "s" ]; then
		echo "###########################################################"
		echo "#                        ATTENZIONE                       #"
		echo "#  Ora ti sarà chiesto di inserire i nomi ed i tipi dei   #"
		echo "#  campi della tabella. Ricorda che i nomi di campo NON   #"
		echo "#  devono contenere spazi, caratteri speciali (tranne _)  #"
		echo "#  o lettere accentate.                                   #"
		echo "#                ----------------------                   #"
		echo "#  NON bisogna inserire l'ID della tabella: lo script     #"
		echo "#  inserisce automaticamente un ID mediumint(8) in auto-  #"
		echo "#  increment (puoi modificare configurando lo script).    #"
		echo "#                ----------------------                   #"
		echo "#  Per terminare l'inserimento dei campi, digita 'q'      #"
		echo "#                                                         #"
		echo "###########################################################"
		echo
		read -p "Procediamo? (s) ==> " SN3
		if [ $SN3 != "s" ]; then
			echo "Arrivederci"
			cd $INDIR
			exit 1
		fi
		NF=1
		[ -d "$MYOPDIR" ] || mkdir $MYOPDIR
		echo "CREATE TABLE $2(" > $MYOPDIR/$2.sql
		echo "$IDEN unsigned NOT NULL auto_increment PRIMARY KEY" >> $MYOPDIR/$2.sql
		while [[ $NMF != "q" ]]; do
			echo "==========================================================="
			echo "             inserisci il nome del campo n. $NF"
			echo "                   per finire digita 'q'"
			echo "==========================================================="
			echo
			read -p "Nome campo $NF ==> " NMF
			let "NF += 1"
			[ $NMF = "q" ] || echo "," >> $MYOPDIR/$2.sql
			[ $NMF = "q" ] && break
			echo
			echo "==========================================================="
			echo "Scegli il tipo del campo $NMF"
			echo "----------------------------------"
			for NT in 1 2 3 4 5; do
				echo "$NT - ${TIPI[$NT-1]}"
			done
			echo "==========================================================="
			echo
			read -p "Tipo ==> " T
			echo
			echo "$NMF ${TIPI[$T-1]}" >> $MYOPDIR/$2.sql
		done
		echo ");" >> $MYOPDIR/$2.sql
# invoca mysql per la creazione della tabella
		mysql -u $US --password=$PAW $DAB < $MYOPDIR/$2.sql
	else
		echo "Devi rispondere o 's' o 'n'..."
		cd $INDIR
		exit 1
	fi
else
	echo "Bene: possiamo procedere!"
	echo "-------------------------"
	[ -e "$MYOPDIR/$2.sql" ] && > $MYOPDIR/$2.sql
fi
cd $INDIR
#  passa la patata bollente al file php che effettua,
#+ di fatto, l'estrazione dei dati dal file .csv
php csv2mysql.php $HO $US $PAW $DAB $2 $FILECSV
echo
echo "------------------------------------------------------------------------------"
echo "LA PROCEDURA E' TERMINATA!"
if [[ $SN3 = "s" ]]; then
	echo
	echo "Se la tabella non è stata creata,"
	echo "controlla la struttura delle query nel file"
	echo "$HOME/$MYOPDIR/$2.sql."
fi
echo
echo "Se la tabella non è stata popolata,"
echo "il file csv ha qualcosa di sbagliato."
echo
echo "Arrivederci! :)"
echo "------------------------------------------------------------------------------"
exit 0

Script csv2mysql.php

#!/usr/bin/php
<?
# csv2mysql.php 0.7.10.1 - php aid
# complemento in php dello script bash csv2mysql
#
# ninobi (Antonino Branca) - aschenaz@gmail.com
# 2007 copyleft
#
$host=$argv[1];$us=$argv[2];$pw=$argv[3];$db=$argv[4];$t=$argv[5];$f=$argv[6];
$c=mysql_connect($host,$us,$pw);mysql_select_db($db);
$handle = fopen($f,"r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
	$num = count($data);
	$q="INSERT INTO $t VALUES('',";
	for ($c=0; $c < $num; $c++) {
       	$q.="'".addslashes($data[$c])."'";
		if($c<($num-1)) $q.=",";
	}
	$q.=")";
	mysql_query($q);
}
fclose($handle);mysql_close();
?>
  • Data: 21/10/2007
  • Autore: Ninobi