ajout de l'option -A pour analyser les données d'un fichiers csv

This commit is contained in:
Jephté Clain 2015-03-08 17:18:31 +04:00
parent 77f2ac2832
commit 8857fa6c10
1 changed files with 120 additions and 7 deletions

View File

@ -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