ajout de awkfsv2csv

This commit is contained in:
Jephté Clain 2014-01-21 11:35:07 +04:00
parent 0fb65ad026
commit 8989f00231
3 changed files with 86 additions and 2 deletions

13
uawk
View File

@ -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

View File

@ -1 +1 @@
18
19

View File

@ -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é