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= | ||||
|     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
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								uawk
									
									
									
									
									
								
							| @ -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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user