implémenter awkcsv2fsv. corriger un bug avec les outils qui utilisaient cawkrun à l'intérieur d'une fonction l*

This commit is contained in:
Jephté Clain 2017-08-24 12:15:16 +04:00
parent 2f448d542d
commit 377ca5e82f
2 changed files with 77 additions and 14 deletions

View File

@ -841,7 +841,7 @@ function lawkcsv() {
reset_fields= reset_fields=
fi fi
awkrun -f \ lawkrun -f \
skip_lines:int="$skip" parse_headers:int="$parse_headers" \ skip_lines:int="$skip" parse_headers:int="$parse_headers" \
autosep:int="$autosep" colsep="$colsep" qchar="$qchar" echar="$echar" \ autosep:int="$autosep" colsep="$colsep" qchar="$qchar" echar="$echar" \
show_headers:int="$show_headers" reset_fields:int="$reset_fields" \ show_headers:int="$show_headers" reset_fields:int="$reset_fields" \
@ -978,7 +978,7 @@ function lgrepcsv() {
headers=("$@") headers=("$@")
if [ -z "${headers[*]}" ]; then if [ -z "${headers[*]}" ]; then
parse_headers=1 parse_headers=1
array_from_lines headers "$(awkrun -f lskip:int="$skip" 'NR <= lskip { next } array_from_lines headers "$(lawkrun -f lskip:int="$skip" 'NR <= lskip { next }
{ {
count = array_parsecsv(__fields, $0) count = array_parsecsv(__fields, $0)
for (i = 1; i <= count; i++) { for (i = 1; i <= count; i++) {
@ -1077,7 +1077,7 @@ function lawkfsv2csv() {
done done
shift shift
awkrun -f \ lawkrun -f \
skip_lines:int="$skip" trim_values:int="$rtrim" show_headers:int="$show_headers" \ skip_lines:int="$skip" trim_values:int="$rtrim" show_headers:int="$show_headers" \
headers[@] starts[@] sizes[@] \ headers[@] starts[@] sizes[@] \
"$__AWKCSV_FUNCTIONS"' "$__AWKCSV_FUNCTIONS"'
@ -1109,6 +1109,57 @@ function awkfsv2csv() { LANG=C lawkfsv2csv "$@"; }
################################################################################ ################################################################################
__AWKCSV2FSV_HELP="\
Transformer un flux csv en fsv (colonnes à largeurs fixes)
Chaque argument doit être de la forme field:size"
function lawkcsv2fsv() {
local -a args fieldsizes
if parse_opts @ args -- "$@"; then
set -- "${args[@]}"
else
eerror "$args"
return 1
fi
local -a fields sizes
local fieldsize field size
while [ $# -gt 0 -a "$1" != "--" ]; do
fieldsize="$1"
shift
splitpair "$fieldsize" field size
[ -n "$field" ] || {
eerror "field est requis"
return 1
}
[ -n "$size" ] || size=1
array_add fields "$field"
array_add sizes "$size"
done
shift
lawkcsv -v fields[@] -v sizes[@] -a '
{
line = ""
for (i = 1; i <= fields_count; i++) {
size = sizes[i] + 0
value = get(fields[i])
while (length(value) < size) value = value " "
if (length(value) > size) value = substr(value, 1, size)
line = line value
}
print line
}
' -- "$@"
}
function cawkcsv2fsv() { LANG=C lawkcsv2fsv "$@"; }
function awkcsv2fsv() { LANG=C lawkcsv2fsv "$@"; }
################################################################################
__MERGECSV_HELP="\ __MERGECSV_HELP="\
Fusionner deux fichiers csv en faisant la correspondance sur la valeur d'un Fusionner deux fichiers csv en faisant la correspondance sur la valeur d'un
champ, qui est la clé champ, qui est la clé
@ -1264,14 +1315,14 @@ function lmergecsv() {
[ "$parse_headers" == "auto" ] && parse_headers=1 [ "$parse_headers" == "auto" ] && parse_headers=1
if [ -n "$parse_headers" ]; then if [ -n "$parse_headers" ]; then
[ -n "$lheaders" ] || lheaders="$(<"$lfile" awkrun lskip:int="$lskip" 'NR <= lskip { next } { print; exit }')" [ -n "$lheaders" ] || lheaders="$(<"$lfile" lawkrun lskip:int="$lskip" 'NR <= lskip { next } { print; exit }')"
[ -n "$rheaders" ] || rheaders="$(<"$rfile" awkrun lskip:int="$lskip" 'NR <= lskip { next } { print; exit }')" [ -n "$rheaders" ] || rheaders="$(<"$rfile" lawkrun lskip:int="$lskip" 'NR <= lskip { next } { print; exit }')"
fi fi
# faire le fichier de travail pour lfile # faire le fichier de travail pour lfile
local tmpleft local tmpleft
ac_set_tmpfile tmpleft "" __mergecsv_left "" __MERGECSV_DEBUG ac_set_tmpfile tmpleft "" __mergecsv_left "" __MERGECSV_DEBUG
<"$lfile" awkrun -f \ <"$lfile" lawkrun -f \
padding="$padding" padlen:int="$padlen" \ padding="$padding" padlen:int="$padlen" \
parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \ parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \
lskip:int="$lskip" lkey="$lkey" \ lskip:int="$lskip" lkey="$lkey" \
@ -1295,7 +1346,7 @@ parse_headers && do_once("parse-headers") {
# faire le fichier de travail pour rfile # faire le fichier de travail pour rfile
local tmpright local tmpright
ac_set_tmpfile tmpright "" __mergecsv_right "" __MERGECSV_DEBUG ac_set_tmpfile tmpright "" __mergecsv_right "" __MERGECSV_DEBUG
<"$rfile" awkrun -f \ <"$rfile" lawkrun -f \
padding="$padding" padlen:int="$padlen" \ padding="$padding" padlen:int="$padlen" \
parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \ parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \
rskip:int="$rskip" rkey="$rkey" \ rskip:int="$rskip" rkey="$rkey" \
@ -1409,7 +1460,7 @@ parse_headers && do_once("parse-headers") {
ac_set_tmpfile tmpmerged "" __mergecsv_merged "" __MERGECSV_DEBUG ac_set_tmpfile tmpmerged "" __mergecsv_merged "" __MERGECSV_DEBUG
csort -s -k 1,$(($padlen + 1)) "$tmpleft" "$tmpright" >"$tmpmerged" csort -s -k 1,$(($padlen + 1)) "$tmpleft" "$tmpright" >"$tmpmerged"
<"$tmpmerged" awkrun -f \ <"$tmpmerged" lawkrun -f \
padlen:int="$padlen" \ padlen:int="$padlen" \
parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \ parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \
lheaderscsv="$lheaders" lkey="$lkey" lprefix="$lprefix" \ lheaderscsv="$lheaders" lkey="$lkey" lprefix="$lprefix" \
@ -1700,14 +1751,14 @@ function lsortcsv() {
cat >"$tmpinput" cat >"$tmpinput"
input="$tmpinput" input="$tmpinput"
fi fi
headers="$(<"$input" awkrun skip:int="$skip" 'NR <= skip { next } { print; exit }')" headers="$(<"$input" lawkrun skip:int="$skip" 'NR <= skip { next } { print; exit }')"
fi fi
# faire le fichier de travail # faire le fichier de travail
local tmpinput local tmpinput
ac_set_tmpfile tmpinput "" __sortcsv_input "" __SORTCSV_DEBUG ac_set_tmpfile tmpinput "" __sortcsv_input "" __SORTCSV_DEBUG
array_add tmpfiles "$tmpinput" array_add tmpfiles "$tmpinput"
<"$input" >"$tmpinput" awkrun -f \ <"$input" >"$tmpinput" lawkrun -f \
padding="$padding" padlen:int="$padlen" \ padding="$padding" padlen:int="$padlen" \
skip:int="$skip" parse_headers:int="$parse_headers" \ skip:int="$skip" parse_headers:int="$parse_headers" \
key="$key" \ key="$key" \
@ -1740,7 +1791,7 @@ parse_headers && do_once("parse-headers") {
# résultat # résultat
[ -n "$output" ] || output=/dev/stdout [ -n "$output" ] || output=/dev/stdout
stdredir "$tmpsorted" "$output" "" awkrun -f \ stdredir "$tmpsorted" "$output" "" lawkrun -f \
padlen:int="$padlen" \ padlen:int="$padlen" \
headerscsv="$headers" show_headers:int="$show_headers" \ headerscsv="$headers" show_headers:int="$show_headers" \
' '
@ -2060,7 +2111,7 @@ function lprintcsv() {
[ -n "$output" ] || output=/dev/stdout [ -n "$output" ] || output=/dev/stdout
values=("$@") values=("$@")
stdredir "" ">>$output" "" awkrun -f fields[@] show_headers:int="$show_headers" values[@] ' stdredir "" ">>$output" "" lawkrun -f fields[@] show_headers:int="$show_headers" values[@] '
BEGIN { BEGIN {
if (show_headers) array_printcsv(fields) if (show_headers) array_printcsv(fields)
if (fields_count > 0) count = fields_count if (fields_count > 0) count = fields_count

16
uawk
View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # -*- 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 printcsv) TOOLS=(awkrun awkcsv grepcsv awkfsv2csv awkcsv2fsv mergecsv sortcsv dumpcsv printcsv)
if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
# créer les liens # créer les liens
scriptname="$(basename "$0")" scriptname="$(basename "$0")"
@ -49,6 +49,7 @@ run) tool=awkrun;;
csv) tool=awkcsv;; csv) tool=awkcsv;;
grep) tool=grepcsv;; grep) tool=grepcsv;;
fsv2csv|fsv) tool=awkfsv2csv;; fsv2csv|fsv) tool=awkfsv2csv;;
csv2fsv) tool=awkcsv2fsv;;
merge) tool=mergecsv;; merge) tool=mergecsv;;
sort) tool=sortcsv;; sort) tool=sortcsv;;
dump) tool=dumpcsv;; dump) tool=dumpcsv;;
@ -95,12 +96,23 @@ elif [ "$tool" == "awkfsv2csv" ]; then
${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C ${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C
} }
USAGE USAGE
$scriptname [options] -- [header:sizes...] [-- inputfiles...] $scriptname [options] -- [header:size,...] [-- inputfiles...]
$__AWKFSV2CSV_HELP" $__AWKFSV2CSV_HELP"
"${prefix}awkfsv2csv" "$@" "${prefix}awkfsv2csv" "$@"
elif [ "$tool" == "awkcsv2fsv" ]; then
[ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: wrapper autour de awk pour transformer un fichier à colonnes fixes en fichier csv
${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C
}
USAGE
$scriptname [options] -- [field:size,...] [-- inputfiles...]
$__AWKCSV2FSV_HELP"
"${prefix}awkcsv2fsv" "$@"
elif [ "$tool" == "mergecsv" ]; then elif [ "$tool" == "mergecsv" ]; then
[ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: fusionner deux fichiers csv sur un champ commun [ $# -eq 1 -a "$1" == --help ] && exit_with uecho "$scriptname: fusionner deux fichiers csv sur un champ commun
${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C ${Clang:+note: ce script ne tient pas compte de la locale: il travaille avec LANG=C