diff --git a/docs/src/data/cases.csv b/docs/src/data/cases.csv new file mode 100644 index 000000000..7414c73a7 --- /dev/null +++ b/docs/src/data/cases.csv @@ -0,0 +1,2 @@ +apple,ball,cat,dog,the quick brown fox +sun,tree,urchin,violet,jumped over the lazy dog diff --git a/docs/src/manpage.md b/docs/src/manpage.md index 65ffe0d8c..bcec7ff9e 100644 --- a/docs/src/manpage.md +++ b/docs/src/manpage.md @@ -192,15 +192,14 @@ MILLER(1) MILLER(1) for all things with "map" in their names. 1mVERB LIST0m - altkv bar bootstrap cat check clean-whitespace count-distinct count - count-similar cut decimate downcase fill-down fill-empty filter flatten - format-values fraction gap grep group-by group-like having-fields head - histogram json-parse json-stringify join label latin1-to-utf8 least-frequent - merge-fields most-frequent nest nothing put regularize remove-empty-columns - rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle - skip-trivial-records sort sort-within-records split stats1 stats2 step summary - tac tail tee template top utf8-to-latin1 unflatten uniq unspace unsparsify - upcase + altkv bar bootstrap case cat check clean-whitespace count-distinct count + count-similar cut decimate fill-down fill-empty filter flatten format-values + fraction gap grep group-by group-like having-fields head histogram json-parse + json-stringify join label latin1-to-utf8 least-frequent merge-fields + most-frequent nest nothing put regularize remove-empty-columns rename reorder + repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records + sort sort-within-records split stats1 stats2 step summary tac tail tee + template top utf8-to-latin1 unflatten uniq unspace unsparsify 1mFUNCTION LIST0m abs acos acosh any append apply arrayify asin asinh asserting_absent @@ -909,6 +908,19 @@ MILLER(1) MILLER(1) Must be non-negative. -h|--help Show this message. + 1mcase0m + Usage: mlr case [options] + Uppercases strings in record keys and/or values. + Options: + -k Case only keys, not keys and values. + -v Case only values, not keys and values. + -f {a,b,c} Specify which field names to case (default: all) + -u Convert to uppercase + -l Convert to lowercase + -s Convert to sentence case (capitalize first letter) + -t Convert to title case (capitalize words) + -h|--help Show this message. + 1mcat0m Usage: mlr cat [options] Passes input records directly to output. Most useful for format conversion. @@ -1006,14 +1018,6 @@ MILLER(1) MILLER(1) -n {n} Decimation factor (default 10). -h|--help Show this message. - 1mdowncase0m - Usage: mlr downcase [options] - Lowercases strings in record keys and/or values. - Options: - -k Downcase only keys, not keys and values. - -v Downcase only values, not keys and values. - -h|--help Show this message. - 1mfill-down0m Usage: mlr fill-down [options] If a given record has a missing value for a given field, fill that from @@ -2127,14 +2131,6 @@ MILLER(1) MILLER(1) being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and 'a=,b=3,c=4'. - 1mupcase0m - Usage: mlr upcase [options] - Uppercases strings in record keys and/or values. - Options: - -k Upcase only keys, not keys and values. - -v Upcase only values, not keys and values. - -h|--help Show this message. - 1mFUNCTIONS FOR FILTER/PUT0m 1mabs0m (class=math #args=1) Absolute value. @@ -3358,5 +3354,5 @@ MILLER(1) MILLER(1) - 2023-06-03 MILLER(1) + 2023-06-04 MILLER(1) diff --git a/docs/src/manpage.txt b/docs/src/manpage.txt index 3d89f78db..24af81017 100644 --- a/docs/src/manpage.txt +++ b/docs/src/manpage.txt @@ -171,15 +171,14 @@ MILLER(1) MILLER(1) for all things with "map" in their names. 1mVERB LIST0m - altkv bar bootstrap cat check clean-whitespace count-distinct count - count-similar cut decimate downcase fill-down fill-empty filter flatten - format-values fraction gap grep group-by group-like having-fields head - histogram json-parse json-stringify join label latin1-to-utf8 least-frequent - merge-fields most-frequent nest nothing put regularize remove-empty-columns - rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle - skip-trivial-records sort sort-within-records split stats1 stats2 step summary - tac tail tee template top utf8-to-latin1 unflatten uniq unspace unsparsify - upcase + altkv bar bootstrap case cat check clean-whitespace count-distinct count + count-similar cut decimate fill-down fill-empty filter flatten format-values + fraction gap grep group-by group-like having-fields head histogram json-parse + json-stringify join label latin1-to-utf8 least-frequent merge-fields + most-frequent nest nothing put regularize remove-empty-columns rename reorder + repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records + sort sort-within-records split stats1 stats2 step summary tac tail tee + template top utf8-to-latin1 unflatten uniq unspace unsparsify 1mFUNCTION LIST0m abs acos acosh any append apply arrayify asin asinh asserting_absent @@ -888,6 +887,19 @@ MILLER(1) MILLER(1) Must be non-negative. -h|--help Show this message. + 1mcase0m + Usage: mlr case [options] + Uppercases strings in record keys and/or values. + Options: + -k Case only keys, not keys and values. + -v Case only values, not keys and values. + -f {a,b,c} Specify which field names to case (default: all) + -u Convert to uppercase + -l Convert to lowercase + -s Convert to sentence case (capitalize first letter) + -t Convert to title case (capitalize words) + -h|--help Show this message. + 1mcat0m Usage: mlr cat [options] Passes input records directly to output. Most useful for format conversion. @@ -985,14 +997,6 @@ MILLER(1) MILLER(1) -n {n} Decimation factor (default 10). -h|--help Show this message. - 1mdowncase0m - Usage: mlr downcase [options] - Lowercases strings in record keys and/or values. - Options: - -k Downcase only keys, not keys and values. - -v Downcase only values, not keys and values. - -h|--help Show this message. - 1mfill-down0m Usage: mlr fill-down [options] If a given record has a missing value for a given field, fill that from @@ -2106,14 +2110,6 @@ MILLER(1) MILLER(1) being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and 'a=,b=3,c=4'. - 1mupcase0m - Usage: mlr upcase [options] - Uppercases strings in record keys and/or values. - Options: - -k Upcase only keys, not keys and values. - -v Upcase only values, not keys and values. - -h|--help Show this message. - 1mFUNCTIONS FOR FILTER/PUT0m 1mabs0m (class=math #args=1) Absolute value. @@ -3337,4 +3333,4 @@ MILLER(1) MILLER(1) - 2023-06-03 MILLER(1) + 2023-06-04 MILLER(1) diff --git a/docs/src/reference-verbs.md b/docs/src/reference-verbs.md index 0558f99d5..be11f8903 100644 --- a/docs/src/reference-verbs.md +++ b/docs/src/reference-verbs.md @@ -233,6 +233,45 @@ orange 0.4802164827586204 290 green 0.5129018241860459 1075 +## case + +
+mlr case --help ++
+Usage: mlr case [options]
+Uppercases strings in record keys and/or values.
+Options:
+-k Case only keys, not keys and values.
+-v Case only values, not keys and values.
+-f {a,b,c} Specify which field names to case (default: all)
+-u Convert to uppercase
+-l Convert to lowercase
+-s Convert to sentence case (capitalize first letter)
+-t Convert to title case (capitalize words)
+-h|--help Show this message.
+
+
++mlr --from test/input/cases.csv --icsv --ojson case -u ++ +
+mlr --from test/input/cases.csv --icsv --ojson case -u -k ++ +
+mlr --from test/input/cases.csv --icsv --ojson case -u -v ++ +
+mlr --from test/input/cases.csv --icsv --ojson case -k -t then case -v -s ++ +
+mlr --from test/input/cases.csv --icsv --ojson case -u -f apple,ball then case -l -f cat,dog ++ ## cat Most useful for format conversions (see [File Formats](file-formats.md)) and concatenating multiple same-schema CSV files to have the same header: @@ -824,20 +863,6 @@ Options: -h|--help Show this message. -## downcase - -
-mlr downcase --help --
-Usage: mlr downcase [options] -Lowercases strings in record keys and/or values. -Options: --k Downcase only keys, not keys and values. --v Downcase only values, not keys and values. --h|--help Show this message. -- ## fill-down
@@ -4288,17 +4313,3 @@ a b v u w x 1 - 2 - - 3 - - 1 - 2 -- -## upcase - -
-mlr upcase --help --
-Usage: mlr upcase [options] -Uppercases strings in record keys and/or values. -Options: --k Upcase only keys, not keys and values. --v Upcase only values, not keys and values. --h|--help Show this message. -diff --git a/docs/src/reference-verbs.md.in b/docs/src/reference-verbs.md.in index 4b022b8dc..0ff0bd15d 100644 --- a/docs/src/reference-verbs.md.in +++ b/docs/src/reference-verbs.md.in @@ -127,6 +127,32 @@ orange 0.4802164827586204 290 green 0.5129018241860459 1075 GENMD-EOF +## case + +GENMD-RUN-COMMAND +mlr case --help +GENMD-EOF + +GENMD-CARDIFY-HIGHLIGHT-ONE +mlr --from test/input/cases.csv --icsv --ojson case -u +GENMD-EOF + +GENMD-CARDIFY-HIGHLIGHT-ONE +mlr --from test/input/cases.csv --icsv --ojson case -u -k +GENMD-EOF + +GENMD-CARDIFY-HIGHLIGHT-ONE +mlr --from test/input/cases.csv --icsv --ojson case -u -v +GENMD-EOF + +GENMD-CARDIFY-HIGHLIGHT-ONE +mlr --from test/input/cases.csv --icsv --ojson case -k -t then case -v -s +GENMD-EOF + +GENMD-CARDIFY-HIGHLIGHT-ONE +mlr --from test/input/cases.csv --icsv --ojson case -u -f apple,ball then case -l -f cat,dog +GENMD-EOF + ## cat Most useful for format conversions (see [File Formats](file-formats.md)) and concatenating multiple same-schema CSV files to have the same header: @@ -297,12 +323,6 @@ GENMD-RUN-COMMAND mlr decimate --help GENMD-EOF -## downcase - -GENMD-RUN-COMMAND -mlr downcase --help -GENMD-EOF - ## fill-down GENMD-RUN-COMMAND @@ -1294,9 +1314,3 @@ GENMD-EOF GENMD-RUN-COMMAND mlr --ijson --opprint unsparsify -f a,b,u,v,w,x then regularize data/sparse.json GENMD-EOF - -## upcase - -GENMD-RUN-COMMAND -mlr upcase --help -GENMD-EOF diff --git a/go.mod b/go.mod index 7f5e1af79..3fdedfc87 100644 --- a/go.mod +++ b/go.mod @@ -35,5 +35,6 @@ require ( github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/text v0.9.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index e98d6ac52..8c5fe4b45 100644 --- a/go.sum +++ b/go.sum @@ -42,6 +42,8 @@ golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/pkg/transformers/aaa_transformer_table.go b/internal/pkg/transformers/aaa_transformer_table.go index 995cf54a4..60f490e0d 100644 --- a/internal/pkg/transformers/aaa_transformer_table.go +++ b/internal/pkg/transformers/aaa_transformer_table.go @@ -14,6 +14,7 @@ var TRANSFORMER_LOOKUP_TABLE = []TransformerSetup{ AltkvSetup, BarSetup, BootstrapSetup, + CaseSetup, CatSetup, CheckSetup, CleanWhitespaceSetup, @@ -22,7 +23,6 @@ var TRANSFORMER_LOOKUP_TABLE = []TransformerSetup{ CountSimilarSetup, CutSetup, DecimateSetup, - DowncaseSetup, FillDownSetup, FillEmptySetup, FilterSetup, @@ -76,7 +76,6 @@ var TRANSFORMER_LOOKUP_TABLE = []TransformerSetup{ UniqSetup, UnspaceSetup, UnsparsifySetup, - UpcaseSetup, } func ShowHelpForTransformer(verb string) bool { diff --git a/internal/pkg/transformers/upcase.go b/internal/pkg/transformers/case.go similarity index 51% rename from internal/pkg/transformers/upcase.go rename to internal/pkg/transformers/case.go index 3610a0a46..f25a68f96 100644 --- a/internal/pkg/transformers/upcase.go +++ b/internal/pkg/transformers/case.go @@ -6,33 +6,50 @@ import ( "os" "strings" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "github.com/johnkerl/miller/internal/pkg/cli" + "github.com/johnkerl/miller/internal/pkg/lib" "github.com/johnkerl/miller/internal/pkg/mlrval" "github.com/johnkerl/miller/internal/pkg/types" ) // ---------------------------------------------------------------- -const verbNameUpcase = "upcase" +const verbNameCase = "case" -var UpcaseSetup = TransformerSetup{ - Verb: verbNameUpcase, - UsageFunc: transformerUpcaseUsage, - ParseCLIFunc: transformerUpcaseParseCLI, +var CaseSetup = TransformerSetup{ + Verb: verbNameCase, + UsageFunc: transformerCaseUsage, + ParseCLIFunc: transformerCaseParseCLI, IgnoresInput: false, } -func transformerUpcaseUsage( +const ( + e_UNSPECIFIED_CASE = iota + e_UPPER_CASE + e_LOWER_CASE + e_SENTENCE_CASE + e_TITLE_CASE +) + +func transformerCaseUsage( o *os.File, ) { - fmt.Fprintf(o, "Usage: %s %s [options]\n", "mlr", verbNameUpcase) + fmt.Fprintf(o, "Usage: %s %s [options]\n", "mlr", verbNameCase) fmt.Fprintf(o, "Uppercases strings in record keys and/or values.\n") fmt.Fprintf(o, "Options:\n") - fmt.Fprintf(o, "-k Upcase only keys, not keys and values.\n") - fmt.Fprintf(o, "-v Upcase only values, not keys and values.\n") + fmt.Fprintf(o, "-k Case only keys, not keys and values.\n") + fmt.Fprintf(o, "-v Case only values, not keys and values.\n") + fmt.Fprintf(o, "-f {a,b,c} Specify which field names to case (default: all)\n") + fmt.Fprintf(o, "-u Convert to uppercase\n") + fmt.Fprintf(o, "-l Convert to lowercase\n") + fmt.Fprintf(o, "-s Convert to sentence case (capitalize first letter)\n") + fmt.Fprintf(o, "-t Convert to title case (capitalize words)\n") fmt.Fprintf(o, "-h|--help Show this message.\n") } -func transformerUpcaseParseCLI( +func transformerCaseParseCLI( pargi *int, argc int, args []string, @@ -42,9 +59,12 @@ func transformerUpcaseParseCLI( // Skip the verb name from the current spot in the mlr command line argi := *pargi + verb := args[argi] argi++ which := "keys_and_values" + style := e_UNSPECIFIED_CASE + var fieldNames []string = nil for argi < argc /* variable increment: 1 or 2 depending on flag */ { opt := args[argi] @@ -57,7 +77,7 @@ func transformerUpcaseParseCLI( argi++ if opt == "-h" || opt == "--help" { - transformerUpcaseUsage(os.Stdout) + transformerCaseUsage(os.Stdout) os.Exit(0) } else if opt == "-k" { @@ -66,8 +86,20 @@ func transformerUpcaseParseCLI( } else if opt == "-v" { which = "values_only" + } else if opt == "-f" { + fieldNames = cli.VerbGetStringArrayArgOrDie(verb, opt, args, &argi, argc) + + } else if opt == "-u" { + style = e_UPPER_CASE + } else if opt == "-l" { + style = e_LOWER_CASE + } else if opt == "-s" { + style = e_SENTENCE_CASE + } else if opt == "-t" { + style = e_TITLE_CASE + } else { - transformerUpcaseUsage(os.Stderr) + transformerCaseUsage(os.Stderr) os.Exit(1) } } @@ -77,7 +109,7 @@ func transformerUpcaseParseCLI( return nil } - transformer, err := NewTransformerUpcase(which) + transformer, err := NewTransformerCase(which, fieldNames, style) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -87,14 +119,21 @@ func transformerUpcaseParseCLI( } // ---------------------------------------------------------------- -type TransformerUpcase struct { +type caserFuncT func(input string) string + +type TransformerCase struct { recordTransformerFunc RecordTransformerFunc + fieldNameSet map[string]bool + caserFunc caserFuncT } -func NewTransformerUpcase( +func NewTransformerCase( which string, -) (*TransformerUpcase, error) { - tr := &TransformerUpcase{} + fieldNames []string, + style int, +) (*TransformerCase, error) { + tr := &TransformerCase{} + if which == "keys_only" { tr.recordTransformerFunc = tr.transformKeysOnly } else if which == "values_only" { @@ -102,10 +141,41 @@ func NewTransformerUpcase( } else { tr.recordTransformerFunc = tr.transformKeysAndValues } + + if fieldNames != nil { + tr.fieldNameSet = lib.StringListToSet(fieldNames) + } + + switch style { + case e_UPPER_CASE: + tr.caserFunc = cases.Upper(language.Und).String + case e_LOWER_CASE: + tr.caserFunc = cases.Lower(language.Und).String + case e_SENTENCE_CASE: + tr.caserFunc = caseSentenceFunc + case e_TITLE_CASE: + tr.caserFunc = cases.Title(language.Und).String + default: + return nil, fmt.Errorf( + "mlr %s: case option must be specified using one of -u, -l, -s, -t.", + verbNameCase, + ) + } + return tr, nil } -func (tr *TransformerUpcase) Transform( +func caseSentenceFunc(input string) string { + runes := []rune(input) + if len(runes) == 0 { + return input + } + first := string(runes[0]) + rest := string(runes[1:]) + return strings.ToUpper(first) + strings.ToLower(rest) +} + +func (tr *TransformerCase) Transform( inrecAndContext *types.RecordAndContext, outputRecordsAndContexts *list.List, // list of *types.RecordAndContext inputDownstreamDoneChannel <-chan bool, @@ -124,7 +194,7 @@ func (tr *TransformerUpcase) Transform( } } -func (tr *TransformerUpcase) transformKeysOnly( +func (tr *TransformerCase) transformKeysOnly( inrecAndContext *types.RecordAndContext, outputRecordsAndContexts *list.List, // list of *types.RecordAndContext _ <-chan bool, @@ -133,14 +203,18 @@ func (tr *TransformerUpcase) transformKeysOnly( inrec := inrecAndContext.Record newrec := mlrval.NewMlrmapAsRecord() for pe := inrec.Head; pe != nil; pe = pe.Next { - newkey := strings.ToUpper(pe.Key) - // Reference not copy since this is ownership transfer of the value from the now-abandoned inrec - newrec.PutReference(newkey, pe.Value) + if tr.fieldNameSet == nil || tr.fieldNameSet[pe.Key] { + newkey := tr.caserFunc(pe.Key) + // Reference not copy since this is ownership transfer of the value from the now-abandoned inrec + newrec.PutReference(newkey, pe.Value) + } else { + newrec.PutReference(pe.Key, pe.Value) + } } outputRecordsAndContexts.PushBack(types.NewRecordAndContext(newrec, &inrecAndContext.Context)) } -func (tr *TransformerUpcase) transformValuesOnly( +func (tr *TransformerCase) transformValuesOnly( inrecAndContext *types.RecordAndContext, outputRecordsAndContexts *list.List, // list of *types.RecordAndContext _ <-chan bool, @@ -148,15 +222,17 @@ func (tr *TransformerUpcase) transformValuesOnly( ) { inrec := inrecAndContext.Record for pe := inrec.Head; pe != nil; pe = pe.Next { - stringval, ok := pe.Value.GetStringValue() - if ok { - pe.Value = mlrval.FromString(strings.ToUpper(stringval)) + if tr.fieldNameSet == nil || tr.fieldNameSet[pe.Key] { + stringval, ok := pe.Value.GetStringValue() + if ok { + pe.Value = mlrval.FromString(tr.caserFunc(stringval)) + } } } outputRecordsAndContexts.PushBack(types.NewRecordAndContext(inrec, &inrecAndContext.Context)) } -func (tr *TransformerUpcase) transformKeysAndValues( +func (tr *TransformerCase) transformKeysAndValues( inrecAndContext *types.RecordAndContext, outputRecordsAndContexts *list.List, // list of *types.RecordAndContext _ <-chan bool, @@ -165,13 +241,17 @@ func (tr *TransformerUpcase) transformKeysAndValues( inrec := inrecAndContext.Record newrec := mlrval.NewMlrmapAsRecord() for pe := inrec.Head; pe != nil; pe = pe.Next { - newkey := strings.ToUpper(pe.Key) - stringval, ok := pe.Value.GetStringValue() - if ok { - stringval = strings.ToUpper(stringval) - newrec.PutReference(newkey, mlrval.FromString(stringval)) + if tr.fieldNameSet == nil || tr.fieldNameSet[pe.Key] { + newkey := tr.caserFunc(pe.Key) + stringval, ok := pe.Value.GetStringValue() + if ok { + stringval = tr.caserFunc(stringval) + newrec.PutReference(newkey, mlrval.FromString(stringval)) + } else { + newrec.PutReference(newkey, pe.Value) + } } else { - newrec.PutReference(newkey, pe.Value) + newrec.PutReference(pe.Key, pe.Value) } } outputRecordsAndContexts.PushBack(types.NewRecordAndContext(newrec, &inrecAndContext.Context)) diff --git a/internal/pkg/transformers/downcase.go b/internal/pkg/transformers/downcase.go deleted file mode 100644 index de7879343..000000000 --- a/internal/pkg/transformers/downcase.go +++ /dev/null @@ -1,178 +0,0 @@ -package transformers - -import ( - "container/list" - "fmt" - "os" - "strings" - - "github.com/johnkerl/miller/internal/pkg/cli" - "github.com/johnkerl/miller/internal/pkg/mlrval" - "github.com/johnkerl/miller/internal/pkg/types" -) - -// ---------------------------------------------------------------- -const verbNameDowncase = "downcase" - -var DowncaseSetup = TransformerSetup{ - Verb: verbNameDowncase, - UsageFunc: transformerDowncaseUsage, - ParseCLIFunc: transformerDowncaseParseCLI, - IgnoresInput: false, -} - -func transformerDowncaseUsage( - o *os.File, -) { - fmt.Fprintf(o, "Usage: %s %s [options]\n", "mlr", verbNameDowncase) - fmt.Fprintf(o, "Lowercases strings in record keys and/or values.\n") - fmt.Fprintf(o, "Options:\n") - fmt.Fprintf(o, "-k Downcase only keys, not keys and values.\n") - fmt.Fprintf(o, "-v Downcase only values, not keys and values.\n") - fmt.Fprintf(o, "-h|--help Show this message.\n") -} - -func transformerDowncaseParseCLI( - pargi *int, - argc int, - args []string, - _ *cli.TOptions, - doConstruct bool, // false for first pass of CLI-parse, true for second pass -) IRecordTransformer { - - // Skip the verb name from the current spot in the mlr command line - argi := *pargi - argi++ - - which := "keys_and_values" - - for argi < argc /* variable increment: 1 or 2 depending on flag */ { - opt := args[argi] - if !strings.HasPrefix(opt, "-") { - break // No more flag options to process - } - if args[argi] == "--" { - break // All transformers must do this so main-flags can follow verb-flags - } - argi++ - - if opt == "-h" || opt == "--help" { - transformerDowncaseUsage(os.Stdout) - os.Exit(0) - - } else if opt == "-k" { - which = "keys_only" - - } else if opt == "-v" { - which = "values_only" - - } else { - transformerDowncaseUsage(os.Stderr) - os.Exit(1) - } - } - - *pargi = argi - if !doConstruct { // All transformers must do this for main command-line parsing - return nil - } - - transformer, err := NewTransformerDowncase(which) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - - return transformer -} - -// ---------------------------------------------------------------- -type TransformerDowncase struct { - recordTransformerFunc RecordTransformerFunc -} - -func NewTransformerDowncase( - which string, -) (*TransformerDowncase, error) { - tr := &TransformerDowncase{} - if which == "keys_only" { - tr.recordTransformerFunc = tr.transformKeysOnly - } else if which == "values_only" { - tr.recordTransformerFunc = tr.transformValuesOnly - } else { - tr.recordTransformerFunc = tr.transformKeysAndValues - } - return tr, nil -} - -func (tr *TransformerDowncase) Transform( - inrecAndContext *types.RecordAndContext, - outputRecordsAndContexts *list.List, // list of *types.RecordAndContext - inputDownstreamDoneChannel <-chan bool, - outputDownstreamDoneChannel chan<- bool, -) { - HandleDefaultDownstreamDone(inputDownstreamDoneChannel, outputDownstreamDoneChannel) - if !inrecAndContext.EndOfStream { - tr.recordTransformerFunc( - inrecAndContext, - outputRecordsAndContexts, - inputDownstreamDoneChannel, - outputDownstreamDoneChannel, - ) - } else { // end of record stream - outputRecordsAndContexts.PushBack(inrecAndContext) - } -} - -func (tr *TransformerDowncase) transformKeysOnly( - inrecAndContext *types.RecordAndContext, - outputRecordsAndContexts *list.List, // list of *types.RecordAndContext - _ <-chan bool, - __ chan<- bool, -) { - inrec := inrecAndContext.Record - newrec := mlrval.NewMlrmapAsRecord() - for pe := inrec.Head; pe != nil; pe = pe.Next { - newkey := strings.ToLower(pe.Key) - // Reference not copy since this is ownership transfer of the value from the now-abandoned inrec - newrec.PutReference(newkey, pe.Value) - } - outputRecordsAndContexts.PushBack(types.NewRecordAndContext(newrec, &inrecAndContext.Context)) -} - -func (tr *TransformerDowncase) transformValuesOnly( - inrecAndContext *types.RecordAndContext, - outputRecordsAndContexts *list.List, // list of *types.RecordAndContext - _ <-chan bool, - __ chan<- bool, -) { - inrec := inrecAndContext.Record - for pe := inrec.Head; pe != nil; pe = pe.Next { - stringval, ok := pe.Value.GetStringValue() - if ok { - pe.Value = mlrval.FromString(strings.ToLower(stringval)) - } - } - outputRecordsAndContexts.PushBack(types.NewRecordAndContext(inrec, &inrecAndContext.Context)) -} - -func (tr *TransformerDowncase) transformKeysAndValues( - inrecAndContext *types.RecordAndContext, - outputRecordsAndContexts *list.List, // list of *types.RecordAndContext - _ <-chan bool, - __ chan<- bool, -) { - inrec := inrecAndContext.Record - newrec := mlrval.NewMlrmapAsRecord() - for pe := inrec.Head; pe != nil; pe = pe.Next { - newkey := strings.ToLower(pe.Key) - stringval, ok := pe.Value.GetStringValue() - if ok { - stringval = strings.ToLower(stringval) - newrec.PutReference(newkey, mlrval.FromString(stringval)) - } else { - newrec.PutReference(newkey, pe.Value) - } - } - outputRecordsAndContexts.PushBack(types.NewRecordAndContext(newrec, &inrecAndContext.Context)) -} diff --git a/man/manpage.txt b/man/manpage.txt index 3d89f78db..24af81017 100644 --- a/man/manpage.txt +++ b/man/manpage.txt @@ -171,15 +171,14 @@ MILLER(1) MILLER(1) for all things with "map" in their names. 1mVERB LIST0m - altkv bar bootstrap cat check clean-whitespace count-distinct count - count-similar cut decimate downcase fill-down fill-empty filter flatten - format-values fraction gap grep group-by group-like having-fields head - histogram json-parse json-stringify join label latin1-to-utf8 least-frequent - merge-fields most-frequent nest nothing put regularize remove-empty-columns - rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle - skip-trivial-records sort sort-within-records split stats1 stats2 step summary - tac tail tee template top utf8-to-latin1 unflatten uniq unspace unsparsify - upcase + altkv bar bootstrap case cat check clean-whitespace count-distinct count + count-similar cut decimate fill-down fill-empty filter flatten format-values + fraction gap grep group-by group-like having-fields head histogram json-parse + json-stringify join label latin1-to-utf8 least-frequent merge-fields + most-frequent nest nothing put regularize remove-empty-columns rename reorder + repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records + sort sort-within-records split stats1 stats2 step summary tac tail tee + template top utf8-to-latin1 unflatten uniq unspace unsparsify 1mFUNCTION LIST0m abs acos acosh any append apply arrayify asin asinh asserting_absent @@ -888,6 +887,19 @@ MILLER(1) MILLER(1) Must be non-negative. -h|--help Show this message. + 1mcase0m + Usage: mlr case [options] + Uppercases strings in record keys and/or values. + Options: + -k Case only keys, not keys and values. + -v Case only values, not keys and values. + -f {a,b,c} Specify which field names to case (default: all) + -u Convert to uppercase + -l Convert to lowercase + -s Convert to sentence case (capitalize first letter) + -t Convert to title case (capitalize words) + -h|--help Show this message. + 1mcat0m Usage: mlr cat [options] Passes input records directly to output. Most useful for format conversion. @@ -985,14 +997,6 @@ MILLER(1) MILLER(1) -n {n} Decimation factor (default 10). -h|--help Show this message. - 1mdowncase0m - Usage: mlr downcase [options] - Lowercases strings in record keys and/or values. - Options: - -k Downcase only keys, not keys and values. - -v Downcase only values, not keys and values. - -h|--help Show this message. - 1mfill-down0m Usage: mlr fill-down [options] If a given record has a missing value for a given field, fill that from @@ -2106,14 +2110,6 @@ MILLER(1) MILLER(1) being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and 'a=,b=3,c=4'. - 1mupcase0m - Usage: mlr upcase [options] - Uppercases strings in record keys and/or values. - Options: - -k Upcase only keys, not keys and values. - -v Upcase only values, not keys and values. - -h|--help Show this message. - 1mFUNCTIONS FOR FILTER/PUT0m 1mabs0m (class=math #args=1) Absolute value. @@ -3337,4 +3333,4 @@ MILLER(1) MILLER(1) - 2023-06-03 MILLER(1) + 2023-06-04 MILLER(1) diff --git a/man/mlr.1 b/man/mlr.1 index 08ad3e578..7f16b922b 100644 --- a/man/mlr.1 +++ b/man/mlr.1 @@ -2,12 +2,12 @@ .\" Title: mlr .\" Author: [see the "AUTHOR" section] .\" Generator: ./mkman.rb -.\" Date: 2023-06-03 +.\" Date: 2023-06-04 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "MILLER" "1" "2023-06-03" "\ \&" "\ \&" +.TH "MILLER" "1" "2023-06-04" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Portability definitions .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -212,15 +212,14 @@ for all things with "map" in their names. .RS 0 .\} .nf -altkv bar bootstrap cat check clean-whitespace count-distinct count -count-similar cut decimate downcase fill-down fill-empty filter flatten -format-values fraction gap grep group-by group-like having-fields head -histogram json-parse json-stringify join label latin1-to-utf8 least-frequent -merge-fields most-frequent nest nothing put regularize remove-empty-columns -rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle -skip-trivial-records sort sort-within-records split stats1 stats2 step summary -tac tail tee template top utf8-to-latin1 unflatten uniq unspace unsparsify -upcase +altkv bar bootstrap case cat check clean-whitespace count-distinct count +count-similar cut decimate fill-down fill-empty filter flatten format-values +fraction gap grep group-by group-like having-fields head histogram json-parse +json-stringify join label latin1-to-utf8 least-frequent merge-fields +most-frequent nest nothing put regularize remove-empty-columns rename reorder +repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records +sort sort-within-records split stats1 stats2 step summary tac tail tee +template top utf8-to-latin1 unflatten uniq unspace unsparsify .fi .if n \{\ .RE @@ -1079,6 +1078,25 @@ Options: .fi .if n \{\ .RE +.SS "case" +.if n \{\ +.RS 0 +.\} +.nf +Usage: mlr case [options] +Uppercases strings in record keys and/or values. +Options: +-k Case only keys, not keys and values. +-v Case only values, not keys and values. +-f {a,b,c} Specify which field names to case (default: all) +-u Convert to uppercase +-l Convert to lowercase +-s Convert to sentence case (capitalize first letter) +-t Convert to title case (capitalize words) +-h|--help Show this message. +.fi +.if n \{\ +.RE .SS "cat" .if n \{\ .RS 0 @@ -1224,20 +1242,6 @@ Options: .fi .if n \{\ .RE -.SS "downcase" -.if n \{\ -.RS 0 -.\} -.nf -Usage: mlr downcase [options] -Lowercases strings in record keys and/or values. -Options: --k Downcase only keys, not keys and values. --v Downcase only values, not keys and values. --h|--help Show this message. -.fi -.if n \{\ -.RE .SS "fill-down" .if n \{\ .RS 0 @@ -2669,20 +2673,6 @@ being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and .fi .if n \{\ .RE -.SS "upcase" -.if n \{\ -.RS 0 -.\} -.nf -Usage: mlr upcase [options] -Uppercases strings in record keys and/or values. -Options: --k Upcase only keys, not keys and values. --v Upcase only values, not keys and values. --h|--help Show this message. -.fi -.if n \{\ -.RE .SH "FUNCTIONS FOR FILTER/PUT" .sp diff --git a/test/cases/cli-help/0001/expout b/test/cases/cli-help/0001/expout index fe29d65db..45dc38c63 100644 --- a/test/cases/cli-help/0001/expout +++ b/test/cases/cli-help/0001/expout @@ -34,6 +34,20 @@ Options: Must be non-negative. -h|--help Show this message. +================================================================ +case +Usage: mlr case [options] +Uppercases strings in record keys and/or values. +Options: +-k Case only keys, not keys and values. +-v Case only values, not keys and values. +-f {a,b,c} Specify which field names to case (default: all) +-u Convert to uppercase +-l Convert to lowercase +-s Convert to sentence case (capitalize first letter) +-t Convert to title case (capitalize words) +-h|--help Show this message. + ================================================================ cat Usage: mlr cat [options] @@ -139,15 +153,6 @@ Options: -n {n} Decimation factor (default 10). -h|--help Show this message. -================================================================ -downcase -Usage: mlr downcase [options] -Lowercases strings in record keys and/or values. -Options: --k Downcase only keys, not keys and values. --v Downcase only values, not keys and values. --h|--help Show this message. - ================================================================ fill-down Usage: mlr fill-down [options] @@ -1313,13 +1318,4 @@ Options: Example: if the input is two records, one being 'a=1,b=2' and the other being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and 'a=,b=3,c=4'. - -================================================================ -upcase -Usage: mlr upcase [options] -Uppercases strings in record keys and/or values. -Options: --k Upcase only keys, not keys and values. --v Upcase only values, not keys and values. --h|--help Show this message. ================================================================ diff --git a/test/cases/verb-case/0001/cmd b/test/cases/verb-case/0001/cmd new file mode 100644 index 000000000..39289881b --- /dev/null +++ b/test/cases/verb-case/0001/cmd @@ -0,0 +1 @@ +mlr case -u test/input/abixy diff --git a/test/cases/verb-downcase/0001/experr b/test/cases/verb-case/0001/experr similarity index 100% rename from test/cases/verb-downcase/0001/experr rename to test/cases/verb-case/0001/experr diff --git a/test/cases/verb-upcase/0001/expout b/test/cases/verb-case/0001/expout similarity index 100% rename from test/cases/verb-upcase/0001/expout rename to test/cases/verb-case/0001/expout diff --git a/test/cases/verb-case/0002/cmd b/test/cases/verb-case/0002/cmd new file mode 100644 index 000000000..6705d2173 --- /dev/null +++ b/test/cases/verb-case/0002/cmd @@ -0,0 +1 @@ +mlr case -u -k test/input/abixy diff --git a/test/cases/verb-downcase/0002/experr b/test/cases/verb-case/0002/experr similarity index 100% rename from test/cases/verb-downcase/0002/experr rename to test/cases/verb-case/0002/experr diff --git a/test/cases/verb-downcase/0006/expout b/test/cases/verb-case/0002/expout similarity index 100% rename from test/cases/verb-downcase/0006/expout rename to test/cases/verb-case/0002/expout diff --git a/test/cases/verb-case/0003/cmd b/test/cases/verb-case/0003/cmd new file mode 100644 index 000000000..2f7f3a2a8 --- /dev/null +++ b/test/cases/verb-case/0003/cmd @@ -0,0 +1 @@ +mlr case -u -v test/input/abixy diff --git a/test/cases/verb-downcase/0003/experr b/test/cases/verb-case/0003/experr similarity index 100% rename from test/cases/verb-downcase/0003/experr rename to test/cases/verb-case/0003/experr diff --git a/test/cases/verb-downcase/0005/expout b/test/cases/verb-case/0003/expout similarity index 100% rename from test/cases/verb-downcase/0005/expout rename to test/cases/verb-case/0003/expout diff --git a/test/cases/verb-case/0004/cmd b/test/cases/verb-case/0004/cmd new file mode 100644 index 000000000..8a7f54fc5 --- /dev/null +++ b/test/cases/verb-case/0004/cmd @@ -0,0 +1 @@ +mlr case -u test/input/abixy-upper diff --git a/test/cases/verb-downcase/0004/experr b/test/cases/verb-case/0004/experr similarity index 100% rename from test/cases/verb-downcase/0004/experr rename to test/cases/verb-case/0004/experr diff --git a/test/cases/verb-upcase/0004/expout b/test/cases/verb-case/0004/expout similarity index 100% rename from test/cases/verb-upcase/0004/expout rename to test/cases/verb-case/0004/expout diff --git a/test/cases/verb-case/0005/cmd b/test/cases/verb-case/0005/cmd new file mode 100644 index 000000000..359b02706 --- /dev/null +++ b/test/cases/verb-case/0005/cmd @@ -0,0 +1 @@ +mlr case -u -k test/input/abixy-upper diff --git a/test/cases/verb-downcase/0005/experr b/test/cases/verb-case/0005/experr similarity index 100% rename from test/cases/verb-downcase/0005/experr rename to test/cases/verb-case/0005/experr diff --git a/test/cases/verb-upcase/0005/expout b/test/cases/verb-case/0005/expout similarity index 100% rename from test/cases/verb-upcase/0005/expout rename to test/cases/verb-case/0005/expout diff --git a/test/cases/verb-case/0006/cmd b/test/cases/verb-case/0006/cmd new file mode 100644 index 000000000..3484b0a3c --- /dev/null +++ b/test/cases/verb-case/0006/cmd @@ -0,0 +1 @@ +mlr case -u -v test/input/abixy-upper diff --git a/test/cases/verb-downcase/0006/experr b/test/cases/verb-case/0006/experr similarity index 100% rename from test/cases/verb-downcase/0006/experr rename to test/cases/verb-case/0006/experr diff --git a/test/cases/verb-upcase/0006/expout b/test/cases/verb-case/0006/expout similarity index 100% rename from test/cases/verb-upcase/0006/expout rename to test/cases/verb-case/0006/expout diff --git a/test/cases/verb-case/0010/cmd b/test/cases/verb-case/0010/cmd new file mode 100644 index 000000000..020b2bc7b --- /dev/null +++ b/test/cases/verb-case/0010/cmd @@ -0,0 +1 @@ +mlr case -l test/input/abixy diff --git a/test/cases/verb-upcase/0001/experr b/test/cases/verb-case/0010/experr similarity index 100% rename from test/cases/verb-upcase/0001/experr rename to test/cases/verb-case/0010/experr diff --git a/test/cases/verb-downcase/0001/expout b/test/cases/verb-case/0010/expout similarity index 100% rename from test/cases/verb-downcase/0001/expout rename to test/cases/verb-case/0010/expout diff --git a/test/cases/verb-case/0011/cmd b/test/cases/verb-case/0011/cmd new file mode 100644 index 000000000..1726d31cb --- /dev/null +++ b/test/cases/verb-case/0011/cmd @@ -0,0 +1 @@ +mlr case -l -k test/input/abixy diff --git a/test/cases/verb-upcase/0002/experr b/test/cases/verb-case/0011/experr similarity index 100% rename from test/cases/verb-upcase/0002/experr rename to test/cases/verb-case/0011/experr diff --git a/test/cases/verb-downcase/0002/expout b/test/cases/verb-case/0011/expout similarity index 100% rename from test/cases/verb-downcase/0002/expout rename to test/cases/verb-case/0011/expout diff --git a/test/cases/verb-case/0012/cmd b/test/cases/verb-case/0012/cmd new file mode 100644 index 000000000..f04c6817c --- /dev/null +++ b/test/cases/verb-case/0012/cmd @@ -0,0 +1 @@ +mlr case -l -v test/input/abixy diff --git a/test/cases/verb-upcase/0003/experr b/test/cases/verb-case/0012/experr similarity index 100% rename from test/cases/verb-upcase/0003/experr rename to test/cases/verb-case/0012/experr diff --git a/test/cases/verb-downcase/0003/expout b/test/cases/verb-case/0012/expout similarity index 100% rename from test/cases/verb-downcase/0003/expout rename to test/cases/verb-case/0012/expout diff --git a/test/cases/verb-case/0013/cmd b/test/cases/verb-case/0013/cmd new file mode 100644 index 000000000..3c12dec2a --- /dev/null +++ b/test/cases/verb-case/0013/cmd @@ -0,0 +1 @@ +mlr case -l test/input/abixy-upper diff --git a/test/cases/verb-upcase/0004/experr b/test/cases/verb-case/0013/experr similarity index 100% rename from test/cases/verb-upcase/0004/experr rename to test/cases/verb-case/0013/experr diff --git a/test/cases/verb-downcase/0004/expout b/test/cases/verb-case/0013/expout similarity index 100% rename from test/cases/verb-downcase/0004/expout rename to test/cases/verb-case/0013/expout diff --git a/test/cases/verb-case/0014/cmd b/test/cases/verb-case/0014/cmd new file mode 100644 index 000000000..ea72bd565 --- /dev/null +++ b/test/cases/verb-case/0014/cmd @@ -0,0 +1 @@ +mlr case -l -k test/input/abixy-upper diff --git a/test/cases/verb-upcase/0005/experr b/test/cases/verb-case/0014/experr similarity index 100% rename from test/cases/verb-upcase/0005/experr rename to test/cases/verb-case/0014/experr diff --git a/test/cases/verb-upcase/0003/expout b/test/cases/verb-case/0014/expout similarity index 100% rename from test/cases/verb-upcase/0003/expout rename to test/cases/verb-case/0014/expout diff --git a/test/cases/verb-case/0015/cmd b/test/cases/verb-case/0015/cmd new file mode 100644 index 000000000..fd10d998d --- /dev/null +++ b/test/cases/verb-case/0015/cmd @@ -0,0 +1 @@ +mlr case -l -v test/input/abixy-upper diff --git a/test/cases/verb-upcase/0006/experr b/test/cases/verb-case/0015/experr similarity index 100% rename from test/cases/verb-upcase/0006/experr rename to test/cases/verb-case/0015/experr diff --git a/test/cases/verb-upcase/0002/expout b/test/cases/verb-case/0015/expout similarity index 100% rename from test/cases/verb-upcase/0002/expout rename to test/cases/verb-case/0015/expout diff --git a/test/cases/verb-case/0020/cmd b/test/cases/verb-case/0020/cmd new file mode 100644 index 000000000..1aca732d8 --- /dev/null +++ b/test/cases/verb-case/0020/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -u diff --git a/test/cases/verb-case/0020/experr b/test/cases/verb-case/0020/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0020/expout b/test/cases/verb-case/0020/expout new file mode 100644 index 000000000..927021391 --- /dev/null +++ b/test/cases/verb-case/0020/expout @@ -0,0 +1,9 @@ +[ +{ + "APPLE": "SUN", + "BALL": "TREE", + "CAT": "URCHIN", + "DOG": "VIOLET", + "THE QUICK BROWN FOX": "JUMPED OVER THE LAZY DOG" +} +] diff --git a/test/cases/verb-case/0021/cmd b/test/cases/verb-case/0021/cmd new file mode 100644 index 000000000..611668f0c --- /dev/null +++ b/test/cases/verb-case/0021/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -l diff --git a/test/cases/verb-case/0021/experr b/test/cases/verb-case/0021/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0021/expout b/test/cases/verb-case/0021/expout new file mode 100644 index 000000000..35fb19660 --- /dev/null +++ b/test/cases/verb-case/0021/expout @@ -0,0 +1,9 @@ +[ +{ + "apple": "sun", + "ball": "tree", + "cat": "urchin", + "dog": "violet", + "the quick brown fox": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0022/cmd b/test/cases/verb-case/0022/cmd new file mode 100644 index 000000000..351aeef9d --- /dev/null +++ b/test/cases/verb-case/0022/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -s diff --git a/test/cases/verb-case/0022/experr b/test/cases/verb-case/0022/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0022/expout b/test/cases/verb-case/0022/expout new file mode 100644 index 000000000..114f20b64 --- /dev/null +++ b/test/cases/verb-case/0022/expout @@ -0,0 +1,9 @@ +[ +{ + "Apple": "Sun", + "Ball": "Tree", + "Cat": "Urchin", + "Dog": "Violet", + "The quick brown fox": "Jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0023/cmd b/test/cases/verb-case/0023/cmd new file mode 100644 index 000000000..639696885 --- /dev/null +++ b/test/cases/verb-case/0023/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -t diff --git a/test/cases/verb-case/0023/experr b/test/cases/verb-case/0023/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0023/expout b/test/cases/verb-case/0023/expout new file mode 100644 index 000000000..0d7d4e7ab --- /dev/null +++ b/test/cases/verb-case/0023/expout @@ -0,0 +1,9 @@ +[ +{ + "Apple": "Sun", + "Ball": "Tree", + "Cat": "Urchin", + "Dog": "Violet", + "The Quick Brown Fox": "Jumped Over The Lazy Dog" +} +] diff --git a/test/cases/verb-case/0024/cmd b/test/cases/verb-case/0024/cmd new file mode 100644 index 000000000..92b1b2c73 --- /dev/null +++ b/test/cases/verb-case/0024/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -k -u diff --git a/test/cases/verb-case/0024/experr b/test/cases/verb-case/0024/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0024/expout b/test/cases/verb-case/0024/expout new file mode 100644 index 000000000..ce9e8e8dc --- /dev/null +++ b/test/cases/verb-case/0024/expout @@ -0,0 +1,9 @@ +[ +{ + "APPLE": "sun", + "BALL": "tree", + "CAT": "urchin", + "DOG": "violet", + "THE QUICK BROWN FOX": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0025/cmd b/test/cases/verb-case/0025/cmd new file mode 100644 index 000000000..54ae355fd --- /dev/null +++ b/test/cases/verb-case/0025/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -k -l diff --git a/test/cases/verb-case/0025/experr b/test/cases/verb-case/0025/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0025/expout b/test/cases/verb-case/0025/expout new file mode 100644 index 000000000..35fb19660 --- /dev/null +++ b/test/cases/verb-case/0025/expout @@ -0,0 +1,9 @@ +[ +{ + "apple": "sun", + "ball": "tree", + "cat": "urchin", + "dog": "violet", + "the quick brown fox": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0026/cmd b/test/cases/verb-case/0026/cmd new file mode 100644 index 000000000..7408ccc78 --- /dev/null +++ b/test/cases/verb-case/0026/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -k -s diff --git a/test/cases/verb-case/0026/experr b/test/cases/verb-case/0026/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0026/expout b/test/cases/verb-case/0026/expout new file mode 100644 index 000000000..30048db36 --- /dev/null +++ b/test/cases/verb-case/0026/expout @@ -0,0 +1,9 @@ +[ +{ + "Apple": "sun", + "Ball": "tree", + "Cat": "urchin", + "Dog": "violet", + "The quick brown fox": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0027/cmd b/test/cases/verb-case/0027/cmd new file mode 100644 index 000000000..2ad0a4172 --- /dev/null +++ b/test/cases/verb-case/0027/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -k -t diff --git a/test/cases/verb-case/0027/experr b/test/cases/verb-case/0027/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0027/expout b/test/cases/verb-case/0027/expout new file mode 100644 index 000000000..d8ad83564 --- /dev/null +++ b/test/cases/verb-case/0027/expout @@ -0,0 +1,9 @@ +[ +{ + "Apple": "sun", + "Ball": "tree", + "Cat": "urchin", + "Dog": "violet", + "The Quick Brown Fox": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0028/cmd b/test/cases/verb-case/0028/cmd new file mode 100644 index 000000000..ce6a173dc --- /dev/null +++ b/test/cases/verb-case/0028/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -v -u diff --git a/test/cases/verb-case/0028/experr b/test/cases/verb-case/0028/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0028/expout b/test/cases/verb-case/0028/expout new file mode 100644 index 000000000..1239f4707 --- /dev/null +++ b/test/cases/verb-case/0028/expout @@ -0,0 +1,9 @@ +[ +{ + "apple": "SUN", + "ball": "TREE", + "cat": "URCHIN", + "dog": "VIOLET", + "the quick brown fox": "JUMPED OVER THE LAZY DOG" +} +] diff --git a/test/cases/verb-case/0029/cmd b/test/cases/verb-case/0029/cmd new file mode 100644 index 000000000..6c71d7c3c --- /dev/null +++ b/test/cases/verb-case/0029/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -v -l diff --git a/test/cases/verb-case/0029/experr b/test/cases/verb-case/0029/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0029/expout b/test/cases/verb-case/0029/expout new file mode 100644 index 000000000..35fb19660 --- /dev/null +++ b/test/cases/verb-case/0029/expout @@ -0,0 +1,9 @@ +[ +{ + "apple": "sun", + "ball": "tree", + "cat": "urchin", + "dog": "violet", + "the quick brown fox": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0030/cmd b/test/cases/verb-case/0030/cmd new file mode 100644 index 000000000..497577d85 --- /dev/null +++ b/test/cases/verb-case/0030/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -v -s diff --git a/test/cases/verb-case/0030/experr b/test/cases/verb-case/0030/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0030/expout b/test/cases/verb-case/0030/expout new file mode 100644 index 000000000..ef4781bec --- /dev/null +++ b/test/cases/verb-case/0030/expout @@ -0,0 +1,9 @@ +[ +{ + "apple": "Sun", + "ball": "Tree", + "cat": "Urchin", + "dog": "Violet", + "the quick brown fox": "Jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/0031/cmd b/test/cases/verb-case/0031/cmd new file mode 100644 index 000000000..96693e71f --- /dev/null +++ b/test/cases/verb-case/0031/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -v -t diff --git a/test/cases/verb-case/0031/experr b/test/cases/verb-case/0031/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0031/expout b/test/cases/verb-case/0031/expout new file mode 100644 index 000000000..91d79bada --- /dev/null +++ b/test/cases/verb-case/0031/expout @@ -0,0 +1,9 @@ +[ +{ + "apple": "Sun", + "ball": "Tree", + "cat": "Urchin", + "dog": "Violet", + "the quick brown fox": "Jumped Over The Lazy Dog" +} +] diff --git a/test/cases/verb-case/0032/cmd b/test/cases/verb-case/0032/cmd new file mode 100644 index 000000000..903c4edba --- /dev/null +++ b/test/cases/verb-case/0032/cmd @@ -0,0 +1 @@ +mlr --from test/input/cases.csv --c2j case -u -f apple,ball then case -l -f cat,dog diff --git a/test/cases/verb-case/0032/experr b/test/cases/verb-case/0032/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-case/0032/expout b/test/cases/verb-case/0032/expout new file mode 100644 index 000000000..dc1013040 --- /dev/null +++ b/test/cases/verb-case/0032/expout @@ -0,0 +1,9 @@ +[ +{ + "APPLE": "SUN", + "BALL": "TREE", + "cat": "urchin", + "dog": "violet", + "the quick brown fox": "jumped over the lazy dog" +} +] diff --git a/test/cases/verb-case/x b/test/cases/verb-case/x new file mode 100644 index 000000000..a24cc18bd --- /dev/null +++ b/test/cases/verb-case/x @@ -0,0 +1,13 @@ +mkdir 0020; echo mlr --from test/input.cases-csv --c2j case -u > 0020/cmd +mkdir 0021; echo mlr --from test/input.cases-csv --c2j case -l > 0021/cmd +mkdir 0022; echo mlr --from test/input.cases-csv --c2j case -s > 0022/cmd +mkdir 0023; echo mlr --from test/input.cases-csv --c2j case -t > 0023/cmd +mkdir 0024; echo mlr --from test/input.cases-csv --c2j case -k -u > 0024/cmd +mkdir 0025; echo mlr --from test/input.cases-csv --c2j case -k -l > 0025/cmd +mkdir 0026; echo mlr --from test/input.cases-csv --c2j case -k -s > 0026/cmd +mkdir 0027; echo mlr --from test/input.cases-csv --c2j case -k -t > 0027/cmd +mkdir 0028; echo mlr --from test/input.cases-csv --c2j case -v -u > 0028/cmd +mkdir 0029; echo mlr --from test/input.cases-csv --c2j case -v -l > 0029/cmd +mkdir 0030; echo mlr --from test/input.cases-csv --c2j case -v -s > 0030/cmd +mkdir 0031; echo mlr --from test/input.cases-csv --c2j case -v -t > 0031/cmd +mkdir 0032; echo mlr --from test/input.cases-csv --c2j case -u apple,ball then case -l cat,dog > 0032/cmd diff --git a/test/cases/verb-downcase/0001/cmd b/test/cases/verb-downcase/0001/cmd deleted file mode 100644 index 80bd342ae..000000000 --- a/test/cases/verb-downcase/0001/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr downcase test/input/abixy diff --git a/test/cases/verb-downcase/0002/cmd b/test/cases/verb-downcase/0002/cmd deleted file mode 100644 index ae2356962..000000000 --- a/test/cases/verb-downcase/0002/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr downcase -k test/input/abixy diff --git a/test/cases/verb-downcase/0003/cmd b/test/cases/verb-downcase/0003/cmd deleted file mode 100644 index 4414236c5..000000000 --- a/test/cases/verb-downcase/0003/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr downcase -v test/input/abixy diff --git a/test/cases/verb-downcase/0004/cmd b/test/cases/verb-downcase/0004/cmd deleted file mode 100644 index 9f249fac6..000000000 --- a/test/cases/verb-downcase/0004/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr downcase test/input/abixy-upper diff --git a/test/cases/verb-downcase/0005/cmd b/test/cases/verb-downcase/0005/cmd deleted file mode 100644 index 4ffd2e10a..000000000 --- a/test/cases/verb-downcase/0005/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr downcase -k test/input/abixy-upper diff --git a/test/cases/verb-downcase/0006/cmd b/test/cases/verb-downcase/0006/cmd deleted file mode 100644 index 47d9c872d..000000000 --- a/test/cases/verb-downcase/0006/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr downcase -v test/input/abixy-upper diff --git a/test/cases/verb-upcase/0001/cmd b/test/cases/verb-upcase/0001/cmd deleted file mode 100644 index 964df9d6d..000000000 --- a/test/cases/verb-upcase/0001/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr upcase test/input/abixy diff --git a/test/cases/verb-upcase/0002/cmd b/test/cases/verb-upcase/0002/cmd deleted file mode 100644 index 8a1abf078..000000000 --- a/test/cases/verb-upcase/0002/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr upcase -k test/input/abixy diff --git a/test/cases/verb-upcase/0003/cmd b/test/cases/verb-upcase/0003/cmd deleted file mode 100644 index 019bef21f..000000000 --- a/test/cases/verb-upcase/0003/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr upcase -v test/input/abixy diff --git a/test/cases/verb-upcase/0004/cmd b/test/cases/verb-upcase/0004/cmd deleted file mode 100644 index ddbc84c79..000000000 --- a/test/cases/verb-upcase/0004/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr upcase test/input/abixy-upper diff --git a/test/cases/verb-upcase/0005/cmd b/test/cases/verb-upcase/0005/cmd deleted file mode 100644 index 177ef762b..000000000 --- a/test/cases/verb-upcase/0005/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr upcase -k test/input/abixy-upper diff --git a/test/cases/verb-upcase/0006/cmd b/test/cases/verb-upcase/0006/cmd deleted file mode 100644 index a92082c3a..000000000 --- a/test/cases/verb-upcase/0006/cmd +++ /dev/null @@ -1 +0,0 @@ -mlr upcase -v test/input/abixy-upper diff --git a/test/input/cases.csv b/test/input/cases.csv new file mode 100644 index 000000000..7414c73a7 --- /dev/null +++ b/test/input/cases.csv @@ -0,0 +1,2 @@ +apple,ball,cat,dog,the quick brown fox +sun,tree,urchin,violet,jumped over the lazy dog