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
|
Nombre de lignes à sauter dans le fichier en entrée
|
||||||
-n, --fake
|
-n, --fake
|
||||||
Ne pas effectuer l'opération. Afficher simplement la commande SQL.
|
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
|
-T, --truncate
|
||||||
Vider la table avant d'effectuer le chargement
|
Vider la table avant d'effectuer le chargement
|
||||||
-L, --load-data
|
-L, --load-data
|
||||||
|
@ -91,21 +94,50 @@ OPTIONS
|
||||||
chaine spécifiée. Par défaut, utiliser \N
|
chaine spécifiée. Par défaut, utiliser \N
|
||||||
-z, --null-is-empty
|
-z, --null-is-empty
|
||||||
Avec les options -I et -U, considérer que NULL est représenté par la
|
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='
|
__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) {
|
function format_sqlvalue(value) {
|
||||||
if (value == null_value) {
|
if (is_null(value)) {
|
||||||
value = "NULL"
|
value = "NULL"
|
||||||
} else if (value ~ /^[0-9]+$/) {
|
} else if (is_integer(value)) {
|
||||||
} else if (value ~ /^[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'\'')"
|
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'\'')"
|
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'\'')"
|
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'\'')"
|
value = "str_to_date('\''" value "'\'', '\''%Y-%m-%d'\'')"
|
||||||
} else {
|
} else {
|
||||||
gsub(/'\''/, "'\'\''", value)
|
gsub(/'\''/, "'\'\''", value)
|
||||||
|
@ -140,12 +172,14 @@ parse_opts "${PRETTYOPTS[@]}" \
|
||||||
-d:,--auto-dbtable: auto_db= \
|
-d:,--auto-dbtable: auto_db= \
|
||||||
-s:,--skip-lines: skip_lines= \
|
-s:,--skip-lines: skip_lines= \
|
||||||
-n,--fake fake=1 \
|
-n,--fake fake=1 \
|
||||||
|
--run fake= \
|
||||||
-T,--truncate truncate=1 \
|
-T,--truncate truncate=1 \
|
||||||
-L,--load-data method=load \
|
-L,--load-data method=load \
|
||||||
-I,--insert-data method=insert \
|
-I,--insert-data method=insert \
|
||||||
-U:,-k:,--update-data: '$method=update; set@ update_key' \
|
-U:,-k:,--update-data: '$method=update; set@ update_key' \
|
||||||
-Z:,--null-value: null_value= \
|
-Z:,--null-value: null_value= \
|
||||||
-z,--null-is-empty null_value= \
|
-z,--null-is-empty null_value= \
|
||||||
|
-A,--analyse '$method=analyse; fake=1' \
|
||||||
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
||||||
|
|
||||||
dbtable="$1"; shift
|
dbtable="$1"; shift
|
||||||
|
@ -300,6 +334,85 @@ END {
|
||||||
ac_clean "$updates"
|
ac_clean "$updates"
|
||||||
exit $r
|
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
|
else
|
||||||
die "BUG: $method: method non implémentée"
|
die "BUG: $method: method non implémentée"
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in New Issue