ajout de l'option -A pour analyser les données d'un fichiers csv
This commit is contained in:
parent
77f2ac2832
commit
8857fa6c10
127
mysqlloadcsv
127
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
|
||||
|
|
Loading…
Reference in New Issue