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 if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
# créer les liens # créer les liens
scriptname="$(basename "$0")" scriptname="$(basename "$0")"
for alias in awkrun awkcsv mergecsv sortcsv; do for alias in awkrun awkfsv2csv awkcsv mergecsv sortcsv; do
ln -s "$scriptname" "$alias" ln -s "$scriptname" "$alias"
done done
exit 0 exit 0
@ -25,6 +25,17 @@ $__AWKCSV_HELP"
cawkcsv "$@" 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 elif [ "$scriptname" == "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
note: ce script ne tient pas compte de la locale: il travaille avec LANG=C 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="\ __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é