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=
fi
awkrun -f \
lawkrun -f \
skip_lines:int="$skip" parse_headers:int="$parse_headers" \
autosep:int="$autosep" colsep="$colsep" qchar="$qchar" echar="$echar" \
show_headers:int="$show_headers" reset_fields:int="$reset_fields" \
@ -978,7 +978,7 @@ function lgrepcsv() {
headers=("$@")
if [ -z "${headers[*]}" ]; then
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)
for (i = 1; i <= count; i++) {
@ -1077,7 +1077,7 @@ function lawkfsv2csv() {
done
shift
awkrun -f \
lawkrun -f \
skip_lines:int="$skip" trim_values:int="$rtrim" show_headers:int="$show_headers" \
headers[@] starts[@] sizes[@] \
"$__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="\
Fusionner deux fichiers csv en faisant la correspondance sur la valeur d'un
champ, qui est la clé
@ -1264,14 +1315,14 @@ function lmergecsv() {
[ "$parse_headers" == "auto" ] && parse_headers=1
if [ -n "$parse_headers" ]; then
[ -n "$lheaders" ] || lheaders="$(<"$lfile" awkrun lskip:int="$lskip" 'NR <= lskip { next } { print; exit }')"
[ -n "$rheaders" ] || rheaders="$(<"$rfile" 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" lawkrun lskip:int="$lskip" 'NR <= lskip { next } { print; exit }')"
fi
# faire le fichier de travail pour lfile
local tmpleft
ac_set_tmpfile tmpleft "" __mergecsv_left "" __MERGECSV_DEBUG
<"$lfile" awkrun -f \
<"$lfile" lawkrun -f \
padding="$padding" padlen:int="$padlen" \
parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \
lskip:int="$lskip" lkey="$lkey" \
@ -1295,7 +1346,7 @@ parse_headers && do_once("parse-headers") {
# faire le fichier de travail pour rfile
local tmpright
ac_set_tmpfile tmpright "" __mergecsv_right "" __MERGECSV_DEBUG
<"$rfile" awkrun -f \
<"$rfile" lawkrun -f \
padding="$padding" padlen:int="$padlen" \
parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \
rskip:int="$rskip" rkey="$rkey" \
@ -1409,7 +1460,7 @@ parse_headers && do_once("parse-headers") {
ac_set_tmpfile tmpmerged "" __mergecsv_merged "" __MERGECSV_DEBUG
csort -s -k 1,$(($padlen + 1)) "$tmpleft" "$tmpright" >"$tmpmerged"
<"$tmpmerged" awkrun -f \
<"$tmpmerged" lawkrun -f \
padlen:int="$padlen" \
parse_headers:int="$parse_headers" ignore_case:int="$ignore_case" \
lheaderscsv="$lheaders" lkey="$lkey" lprefix="$lprefix" \
@ -1700,14 +1751,14 @@ function lsortcsv() {
cat >"$tmpinput"
input="$tmpinput"
fi
headers="$(<"$input" awkrun skip:int="$skip" 'NR <= skip { next } { print; exit }')"
headers="$(<"$input" lawkrun skip:int="$skip" 'NR <= skip { next } { print; exit }')"
fi
# faire le fichier de travail
local tmpinput
ac_set_tmpfile tmpinput "" __sortcsv_input "" __SORTCSV_DEBUG
array_add tmpfiles "$tmpinput"
<"$input" >"$tmpinput" awkrun -f \
<"$input" >"$tmpinput" lawkrun -f \
padding="$padding" padlen:int="$padlen" \
skip:int="$skip" parse_headers:int="$parse_headers" \
key="$key" \
@ -1740,7 +1791,7 @@ parse_headers && do_once("parse-headers") {
# résultat
[ -n "$output" ] || output=/dev/stdout
stdredir "$tmpsorted" "$output" "" awkrun -f \
stdredir "$tmpsorted" "$output" "" lawkrun -f \
padlen:int="$padlen" \
headerscsv="$headers" show_headers:int="$show_headers" \
'
@ -2060,7 +2111,7 @@ function lprintcsv() {
[ -n "$output" ] || output=/dev/stdout
values=("$@")
stdredir "" ">>$output" "" awkrun -f fields[@] show_headers:int="$show_headers" values[@] '
stdredir "" ">>$output" "" lawkrun -f fields[@] show_headers:int="$show_headers" values[@] '
BEGIN {
if (show_headers) array_printcsv(fields)
if (fields_count > 0) count = fields_count

16
uawk
View File

@ -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 printcsv)
TOOLS=(awkrun awkcsv grepcsv awkfsv2csv awkcsv2fsv mergecsv sortcsv dumpcsv printcsv)
if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
# créer les liens
scriptname="$(basename "$0")"
@ -49,6 +49,7 @@ run) tool=awkrun;;
csv) tool=awkcsv;;
grep) tool=grepcsv;;
fsv2csv|fsv) tool=awkfsv2csv;;
csv2fsv) tool=awkcsv2fsv;;
merge) tool=mergecsv;;
sort) tool=sortcsv;;
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
}
USAGE
$scriptname [options] -- [header:sizes...] [-- inputfiles...]
$scriptname [options] -- [header:size,...] [-- inputfiles...]
$__AWKFSV2CSV_HELP"
"${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
[ $# -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