diff --git a/lib/ulib/awk b/lib/ulib/awk index 845066c..953c3f7 100644 --- a/lib/ulib/awk +++ b/lib/ulib/awk @@ -72,7 +72,7 @@ sqvals(s) print \"mycmd\" sqvals() L'alias qsvals(s) existe pour compatibilité -qarr(vs, prefix) +qarr(vs[, prefix]) quoter les valeurs du tableau vs pour le shell, e.g: print \"values=(\" qarr(values) \")\" si prefix est spécifié, il est affiché suivi d'un espace, suivi des valeurs @@ -1786,7 +1786,6 @@ Afficher les champs spécifiés pour traitement par le shell Le nom du tableau est fixé à 'values'. L'option -n permet de spécifier le nom de la fonction, qui vaut 'dump' par défaut" -: "${__DUMPCSV_DEBUG:=}" function ldumpcsv() { eval "$(utools_local)" local skip= parse_headers=1 @@ -1836,3 +1835,58 @@ function ldumpcsv() { function cdumpcsv() { LANG=C ldumpcsv "$@"; } function dumpcsv() { LANG=C ldumpcsv "$@"; } + +################################################################################ + +__PRINTCSV_HELP="\ +Afficher les valeurs spécifiées au format CSV + +-F, --fields FIELDS + Spécifier les champs en sortie +-o, --output OUTPUT + Ajouter la ligne au fichier spécifié. Si le fichier n'existe pas ou est de + taille vide, et que l'option -F est spécifiée, alors écrire les en-têtes + dans le fichier avant d'écrire les valeurs. +--show-headers +-n, --no-headers + Forcer l'affichage (resp. le non-affichage) des en-têtes" + +function lprintcsv() { + eval "$(utools_local)" + local fields output show_headers=auto + parse_opts "${PRETTYOPTS[@]}" \ + -F:,--fields: fields= \ + -o:,--output: output= \ + -n,--no-headers show_headers= \ + --show-headers show_headers=1 \ + @ args -- "$@" && set -- "${args[@]}" || die "$args" + + array_split fields "$fields" , + [ "$output" == - ] && output= + [ -n "$fields" ] || show_headers= + if [ "$show_headers" == auto ]; then + if [ -n "$output" ]; then + [ -s "$output" ] || show_headers=1 + else + show_headers= + fi + fi + [ -n "$output" ] || output=/dev/stdout + values=("$@") + + awkrun -f >>"$output" fields[@] show_headers:int="$show_headers" values[@] ' +BEGIN { + if (show_headers) array_printcsv(fields) + if (fields_count > 0) count = fields_count + else count = values_count + array_new(output) + for (i = 1; i <= count; i++) { + if (i <= values_count) output[i] = values[i] + else output[i] = "" + } + array_printcsv(output) +}' +} + +function cprintcsv() { LANG=C lprintcsv "$@"; } +function printcsv() { LANG=C lprintcsv "$@"; } diff --git a/uawk b/uawk index 960adc8..bc3d07c 100755 --- a/uawk +++ b/uawk @@ -1,7 +1,7 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 -TOOLS=(awkrun awkcsv grepcsv awkfsv2csv mergecsv sortcsv dumpcsv) +TOOLS=(awkrun awkcsv grepcsv awkfsv2csv mergecsv sortcsv dumpcsv printcsv) if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then # créer les liens scriptname="$(basename "$0")" @@ -123,7 +123,7 @@ $__SORTCSV_HELP" "${prefix}sortcsv" "$@" elif [ "$tool" == "dumpcsv" ]; then - [ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: afficher les champs d'un fichiers CSV pour traitement par le shell + [ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: afficher les champs d'un flux CSV pour traitement par le shell ${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C } USAGE @@ -133,6 +133,17 @@ $__DUMPCSV_HELP" "${prefix}dumpcsv" "$@" +elif [ "$tool" == "printcsv" ]; then + [ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: afficher des champs au format CSV +${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C +} +USAGE + $scriptname [options] values... + +$__PRINTCSV_HELP" + + "${prefix}printcsv" "$@" + elif [ -n "$scriptname" ]; then die "$scriptname: nom d'outil invalide"