diff --git a/mysqlloadcsv b/mysqlloadcsv index 369427a..d4e5392 100755 --- a/mysqlloadcsv +++ b/mysqlloadcsv @@ -67,6 +67,9 @@ OPTIONS Nombre de lignes à sauter dans le fichier en entrée -n, --fake Ne pas effectuer l'opération. Afficher simplement la commande SQL. + --run + Forcer le lancement de l'opération. Utiliser cette option avec -A pour + créer la table avec les paramètres analysés. -T, --truncate Vider la table avant d'effectuer le chargement -L, --load-data @@ -91,21 +94,50 @@ OPTIONS chaine spécifiée. Par défaut, utiliser \N -z, --null-is-empty Avec les options -I et -U, considérer que NULL est représenté par la - chaine vide. Cette option est équivalente à -Z ''" + chaine vide. Cette option est équivalente à -Z '' + -A, --analyse + Analyser les données et afficher une requête pour créer une table qui + pourrait contenir ces données. + Cette option implique --fake et affiche simplement la commande SQL. + Pour lancer la commande SQL générée, il faut ajouter l'option --run + APRES cette option" } __AWK_MYSQLFUNCS=' +function is_null(value) { + return value == null_value +} +function is_integer(value) { + return value ~ /^[0-9]+$/ +} +function is_date_dmy(value) { + return value ~ /^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]$/ +} +function is_date_dmY(value) { + return value ~ /^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]$/ +} +function is_date_Ymd1(value) { + return value ~ /^[0-9][0-9][0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]$/ +} +function is_date_Ymd2(value) { + return value ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ +} +function is_date(value) { + return is_date_dmy(value) || is_date_dmY(value) || is_date_Ymd1(value) || is_date_Ymd2(value) +} +#function is_datetime(value) { +#} function format_sqlvalue(value) { - if (value == null_value) { + if (is_null(value)) { value = "NULL" - } else if (value ~ /^[0-9]+$/) { - } else if (value ~ /^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]$/) { + } else if (is_integer(value)) { + } else if (is_date_dmy(value)) { value = "str_to_date('\''" value "'\'', '\''%d/%m/%y'\'')" - } else if (value ~ /^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]$/) { + } else if (is_date_dmY(value)) { value = "str_to_date('\''" value "'\'', '\''%d/%m/%Y'\'')" - } else if (value ~ /^[0-9][0-9][0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]$/) { + } else if (is_date_Ymd1(value)) { value = "str_to_date('\''" value "'\'', '\''%Y/%m/%d'\'')" - } else if (value ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/) { + } else if (is_date_Ymd2(value)) { value = "str_to_date('\''" value "'\'', '\''%Y-%m-%d'\'')" } else { gsub(/'\''/, "'\'\''", value) @@ -140,12 +172,14 @@ parse_opts "${PRETTYOPTS[@]}" \ -d:,--auto-dbtable: auto_db= \ -s:,--skip-lines: skip_lines= \ -n,--fake fake=1 \ + --run fake= \ -T,--truncate truncate=1 \ -L,--load-data method=load \ -I,--insert-data method=insert \ -U:,-k:,--update-data: '$method=update; set@ update_key' \ -Z:,--null-value: null_value= \ -z,--null-is-empty null_value= \ + -A,--analyse '$method=analyse; fake=1' \ @ args -- "$@" && set -- "${args[@]}" || die "$args" dbtable="$1"; shift @@ -300,6 +334,85 @@ END { ac_clean "$updates" exit $r +elif [ "$method" == analyse ]; then + ac_set_tmpfile create + awkcsv <"$input" >"$create" -s "$skip_lines" -v table="$table" \ + -v null_value="$null_value" -a "$__AWK_MYSQLFUNCS"' +function set_integer(i) { + if (COL_TYPES[i] == "") { + COL_TYPES[i] = "integer" + } +} +function set_datetime(i) { + if (COL_TYPES[i] == "") { + COL_TYPES[i] = "datetime" + } +} +function set_date(i) { + if (COL_TYPES[i] == "") { + COL_TYPES[i] = "date" + } +} +function set_varchar(i, col_size) { + COL_TYPES[i] = "varchar" + if (COL_SIZES[i] == "") { + COL_SIZES[i] = col_size + } else if (col_size > COL_SIZES[i]) { + COL_SIZES[i] = col_size + } +} +{ + if (do_once("init")) { + count = length(ORIGHEADERS) + array_newsize(COL_TYPES, count) + array_newsize(COL_SIZES, count) + } + for (i = 1; i <= count; i++) { + if (is_null($i)) { + } else if (is_integer($i)) { + set_integer(i) +# } else if (is_datetime($i)) { +# set_datetime(i) + } else if (is_date($i)) { + set_date(i) + } else { + set_varchar(i, length($i)) + } + } +} +END { + print "drop table if exists `" table "`;" + print "create table `" table "` (" + for (i = 1; i <= count; i++) { + line = "" + if (i == 1) line = line " " + else line = line "," + line = line "`" ORIGHEADERS[i] "` " + col_type = COL_TYPES[i] + if (col_type == "") col_type = "varchar" + if (col_type == "integer") { + line = line col_type + } else if (col_type == "datetime" || col_type == "date") { + line = line col_type + } else if (col_type == "varchar") { + col_size = COL_SIZES[i] + if (col_size == "") col_size = "80" + line = line col_type "(" col_size ")" + } + print line + } + print ");" +}' + r=0 + if [ -n "$fake" ]; then + cat "$create" + else + cat "$create" | "$scriptdir/mysqlcsv" "${mysqlargs[@]}" -f -; r=$? + fi + + ac_clean "$create" + exit $r + else die "BUG: $method: method non implémentée" fi