Use type-inference in mlr fill-empty (#738)

This commit is contained in:
John Kerl 2021-11-08 23:26:43 -05:00 committed by GitHub
parent 4162da1dd6
commit 9503d0abe2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 31 additions and 4 deletions

2
.gitignore vendored
View file

@ -21,6 +21,8 @@ data/.gitignore
docs/_build
docs6/_build
man/man1
miller-*.src.rpm
mlr.exe
mlr.linux.x86_64

View file

@ -160,6 +160,7 @@ Usage: mlr fill-empty [options]
Fills empty-string fields with specified fill-value.
Options:
-v {string} Fill-value: defaults to "N/A"
-S Don't infer type -- so '-v 0' would fill string 0 not int 0.
================================================================
filter

View file

@ -0,0 +1 @@
mlr --csv fill-empty -v 0 then put -f ${CASEDIR}/mlr regtest/input/fill-down.csv

View file

@ -0,0 +1,4 @@
a,b,c,tb
1,0,3,int
4,5,6,int
7,0,9,int

View file

@ -0,0 +1 @@
$tb = typeof($b)

View file

@ -0,0 +1 @@
mlr --csv fill-empty -Sv 0 then put -f ${CASEDIR}/mlr regtest/input/fill-down.csv

View file

@ -0,0 +1,4 @@
a,b,c,tb
1,0,3,string
4,5,6,int
7,0,9,string

View file

@ -0,0 +1 @@
$tb = typeof($b)

View file

@ -0,0 +1 @@
$tb = typeof($b)

View file

@ -29,6 +29,7 @@ func transformerFillEmptyUsage(
fmt.Fprintf(o, "Fills empty-string fields with specified fill-value.\n")
fmt.Fprintf(o, "Options:\n")
fmt.Fprintf(o, "-v {string} Fill-value: defaults to \"%s\"\n", defaultFillEmptyString)
fmt.Fprintf(o, "-S Don't infer type -- so '-v 0' would fill string 0 not int 0.\n")
if doExit {
os.Exit(exitCode)
@ -48,6 +49,7 @@ func transformerFillEmptyParseCLI(
argi++
fillString := defaultFillEmptyString
inferType := true
for argi < argc /* variable increment: 1 or 2 depending on flag */ {
opt := args[argi]
@ -62,12 +64,15 @@ func transformerFillEmptyParseCLI(
} else if opt == "-v" {
fillString = cli.VerbGetStringArgOrDie(verb, opt, args, &argi, argc)
} else if opt == "-S" {
inferType = false
} else {
transformerFillEmptyUsage(os.Stderr, true, 1)
}
}
transformer, err := NewTransformerFillEmpty(fillString)
transformer, err := NewTransformerFillEmpty(fillString, inferType)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
@ -82,9 +87,15 @@ type TransformerFillEmpty struct {
fillValue *types.Mlrval
}
func NewTransformerFillEmpty(fillString string) (*TransformerFillEmpty, error) {
tr := &TransformerFillEmpty{
fillValue: types.MlrvalFromString(fillString),
func NewTransformerFillEmpty(
fillString string,
inferType bool,
) (*TransformerFillEmpty, error) {
tr := &TransformerFillEmpty{}
if inferType {
tr.fillValue = types.MlrvalFromInferredType(fillString)
} else {
tr.fillValue = types.MlrvalFromString(fillString)
}
return tr, nil
}