From 78e7f7c4944112430c4a834fe2eb3b82a9d3914c Mon Sep 17 00:00:00 2001 From: Andreas Hrubak Date: Mon, 29 Jul 2024 16:17:05 +0200 Subject: [PATCH] implement td2kvpairs --- tabdata/Makefile | 2 ++ tabdata/common.pl | 21 +++++++++++++++++++++ tabdata/kvpairs2td | 4 ++-- tabdata/td2kvpairs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/tabdata/Makefile b/tabdata/Makefile index 4c641ce..4b370f4 100644 --- a/tabdata/Makefile +++ b/tabdata/Makefile @@ -4,8 +4,10 @@ LIB_DIR = /usr/lib/tool/perl5/tabdata TOOLS = \ csv2td \ + kvpairs2td \ mrkv2td \ td2html \ + td2kvpairs \ td2mrkv \ td-add-headers \ td-alter \ diff --git a/tabdata/common.pl b/tabdata/common.pl index 2c9a4a6..71e315f 100644 --- a/tabdata/common.pl +++ b/tabdata/common.pl @@ -81,4 +81,25 @@ sub unescape_tabdata return $raw; } +sub kvpair_escape +{ + my $s = shift; + if($s =~ /[""'' ]/) + { + $s =~ s/[\x00-\x1F\x7F""\\]/sprintf '\\x%02X', ord $&/eg; + $s = "\"$s\""; + } + return $s; +} + +sub kvpair_unescape +{ + my $s = shift; + if($s =~ /^(?'quote'[""''])(?'value'.*?)\g{quote}$/) + { + $s = $+{'value'} =~ s/\\x([[:xdigit:]]{2})/chr hex $1/egir; + } + return $s; +} + 1; diff --git a/tabdata/kvpairs2td b/tabdata/kvpairs2td index 98861b5..be3e130 100755 --- a/tabdata/kvpairs2td +++ b/tabdata/kvpairs2td @@ -4,7 +4,7 @@ =head1 NAME -td2kvpairs - Transform tabular data into key-value pairs +kvpairs2td - Transform lines of key-value pairs to tabular data stream =head1 OPTIONS @@ -26,7 +26,7 @@ Default is B<_REST>. =head1 SEE ALSO -td2mrkv(1), kvpairs2td(1) +td2mrkv(1), td2kvpairs(1) =cut diff --git a/tabdata/td2kvpairs b/tabdata/td2kvpairs index e69de29..3f014fa 100755 --- a/tabdata/td2kvpairs +++ b/tabdata/td2kvpairs @@ -0,0 +1,49 @@ +#!/usr/bin/env perl + +=pod + +=head1 NAME + +td2kvpairs - Transform tabular data into key-value pairs + +=head1 OPTIONS + +=over 4 + +=item -r, --prefix-field I + +Put this field's content before the list of key-value pairs. +Default is B<_REST>. +Prefix and the key-value pairs are separated by a space char, +if there is any prefix. + +=back + +=head1 SEE ALSO + +td2mrkv(1), kvpairs2td(1) + +=cut + +$OptPrefixField = "_REST"; +%OptionDefs = ( + 'r|prefix-field|prefixfield=s' => \$OptPrefixField, +); + +use Data::Dumper; +no if ($] >= 5.018), 'warnings' => 'experimental::smartmatch'; +do '/usr/lib/tool/perl5/tabdata/common.pl' or die "$@"; + +process_header(scalar ); + +while(not eof STDIN) +{ + my @input = read_record(\*STDIN); + my $prefix = ''; + if(exists $Header{$OptPrefixField}) + { + $prefix = $input[$Header{$OptPrefixField}]; + $prefix =~ s/(\S)$/$1 /; + } + print $prefix . join(' ', map { sprintf "%s=%s", kvpair_escape($_), kvpair_escape($input[$Header{$_}]) } grep {$_ ne $OptPrefixField} @Header) . "\n"; +} -- 2.11.4.GIT