diff --git a/uawk b/uawk index 0453807..903ae49 100755 --- a/uawk +++ b/uawk @@ -4,7 +4,7 @@ if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then # créer les liens scriptname="$(basename "$0")" - for alias in awkrun awkcsv mergecsv sortcsv; do + for alias in awkrun awkfsv2csv awkcsv mergecsv sortcsv; do ln -s "$scriptname" "$alias" done exit 0 @@ -25,6 +25,17 @@ $__AWKCSV_HELP" cawkcsv "$@" +elif [ "$scriptname" == "awkfsv2csv" ]; then + [ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: wrapper autour de awk pour transformer un fichier à colonnes fixes en fichier csv +note: ce script ne tient pas compte de la locale: il travaille avec LANG=C + +USAGE + $scriptname [header:sizes...] + +$__AWKFSV2CSV_HELP" + + cawkfsv2csv "$@" + elif [ "$scriptname" == "mergecsv" ]; then [ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: fusionner deux fichiers csv sur un champ commun note: ce script ne tient pas compte de la locale: il travaille avec LANG=C diff --git a/ulib/.ulib_version b/ulib/.ulib_version index 3c03207..d6b2404 100644 --- a/ulib/.ulib_version +++ b/ulib/.ulib_version @@ -1 +1 @@ -18 +19 diff --git a/ulib/awk b/ulib/awk index 1f086b9..73e8307 100644 --- a/ulib/awk +++ b/ulib/awk @@ -754,6 +754,79 @@ function awkcsv() { LANG=C lawkcsv "$@"; } ################################################################################ +__AWKFSV2CSV_HELP="\ +Transformer un flux fsv (colonnes à largeurs fixes) en csv + +Analyse du flux en entrée: +-s, --skip-lines nblines + Sauter nblines au début du flux + +Chaque argument doit être de la forme [-]header:size. La colonne sera incluse +dans le fichier en sortie, sauf si elle est précédée de - + +Flux en sortie: +-n, --no-headers + Ne pas afficher les en-têtes. Par défaut, les en-têtes sont affichés." + +function lawkfsv2csv() { + local -a args headersizes + local skip_lines=0 show_headers=1 + if parse_opts \ + -s:,--skip-lines: skip_lines= \ + -n,--no-headers show_headers= \ + --show-headers show_headers=1 \ + @ args -- "$@"; then + set -- "${args[@]}" + else + eerror "$args" + return 1 + fi + + local -a headers starts sizes + local headersize header i size + i=1 + for headersize in "$@"; do + splitpair "$headersize" header size + [ -n "$header" ] || { + eerror "header est requis" + return 1 + } + [ -n "$size" ] || size=1 + if [ "${header#-}" == "$header" ]; then + array_add headers "$header" + array_add starts "$i" + array_add sizes "$size" + fi + i="$(($i + $size))" + done + + awkrun -f \ + skip_lines:int="$skip_lines" show_headers:int="$show_headers" \ + headers[@] starts[@] sizes[@] \ + "$__AWKCSV_FUNCTIONS"' +BEGIN { + if (show_headers) { + print array_formatcsv(headers) + } +} +NR <= skip_lines { next } +{ + line = $0 + $0 = "" + for (i=1; i <= headers_count; i++) { + $i = substr(line, starts[i], sizes[i]) + } + formatcsv() + print +} +' +} + +function cawkfsv2csv() { LANG=C lawkfsv2csv "$@"; } +function awkfsv2csv() { LANG=C lawkfsv2csv "$@"; } + +################################################################################ + __MERGECSV_HELP="\ Fusionner deux fichiers csv en faisant la correspondance sur la valeur d'un champ, qui est la clé