implémenter awkcsv2fsv. corriger un bug avec les outils qui utilisaient cawkrun à l'intérieur d'une fonction l*
This commit is contained in:
parent
2f448d542d
commit
377ca5e82f
75
lib/ulib/awk
75
lib/ulib/awk
|
@ -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
16
uawk
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue