From 99a95134ccfede0ac909f0534427473334ccd9a6 Mon Sep 17 00:00:00 2001 From: Noboru Saito Date: Thu, 28 Nov 2024 09:15:53 +0900 Subject: [PATCH] Add extension support for text format Add support for determining text format by extension. --- cmd/root.go | 6 ++++-- reader.go | 4 ++++ trdsql.go | 5 +++++ trdsql_test.go | 29 +++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index df54416..1c89fc9 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -292,6 +292,8 @@ func strToFormat(format string) trdsql.Format { return trdsql.TBLN case "width": return trdsql.WIDTH + case "text": + return trdsql.TEXT default: return trdsql.GUESS } @@ -361,9 +363,9 @@ func init() { rootCmd.PersistentFlags().Var(&inNull, "null", "value(string) to convert to null on input.") rootCmd.PersistentFlags().BoolVarP(&inRowNumber, "row-number", "n", false, "add row number.") - rootCmd.PersistentFlags().StringVarP(&inFormat, "in", "i", "GUESS", "format for input. [CSV|LTSV|JSON|YAML|TBLN|WIDTH]") + rootCmd.PersistentFlags().StringVarP(&inFormat, "in", "i", "GUESS", "format for input. [CSV|LTSV|JSON|YAML|TBLN|WIDTH|TEXT]") rootCmd.RegisterFlagCompletionFunc("in", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{"CSV", "LTSV", "JSON", "YAML", "TBLN", "WIDTH"}, cobra.ShellCompDirectiveDefault + return []string{"CSV", "LTSV", "JSON", "YAML", "TBLN", "WIDTH", "TEXT"}, cobra.ShellCompDirectiveDefault }) rootCmd.PersistentFlags().StringVar(&outDelimiter, "out-delimiter", ",", "field delimiter for output.") rootCmd.PersistentFlags().StringVar(&outFile, "out-file", "", "output file name.") diff --git a/reader.go b/reader.go index dbd6820..41c8c82 100644 --- a/reader.go +++ b/reader.go @@ -18,6 +18,7 @@ var extToFormat map[string]Format = map[string]Format{ "TSV": TSV, "PSV": PSV, "WIDTH": WIDTH, + "TEXT": TEXT, } // ReaderFunc is a function that creates a new Reader. @@ -49,6 +50,9 @@ var readerFuncs = map[Format]ReaderFunc{ WIDTH: func(reader io.Reader, opts *ReadOpts) (Reader, error) { return NewGWReader(reader, opts) }, + TEXT: func(reader io.Reader, opts *ReadOpts) (Reader, error) { + return NewTextReader(reader, opts) + }, } var ( diff --git a/trdsql.go b/trdsql.go index 05757db..a9ee9a7 100644 --- a/trdsql.go +++ b/trdsql.go @@ -77,6 +77,9 @@ const ( // Format using guesswidth library. WIDTH + // import + TEXT + // export // Output as it is. // Multiple characters can be selected as delimiter. @@ -142,6 +145,8 @@ func (f Format) String() string { return "PSV" case YAML: return "YAML" + case TEXT: + return "TEXT" default: return "Unknown" } diff --git a/trdsql_test.go b/trdsql_test.go index 66b1393..3c8cb1f 100644 --- a/trdsql_test.go +++ b/trdsql_test.go @@ -567,6 +567,35 @@ func TestTBLNRun(t *testing.T) { } } +func TestTextRun(t *testing.T) { + ctx := context.Background() + testText := [][]string{ + {"test.csv", `1,"1,Orange" +2,"2,Melon" +3,"3,Apple" +`}, + {"aiu.csv", "1,あ\n2,い\n3,う\n"}, + } + outStream := new(bytes.Buffer) + importer := NewImporter( + InFormat(TEXT), + InRowNumber(true), + ) + exporter := NewExporter(NewWriter(OutStream(outStream))) + trd := NewTRDSQL(importer, exporter) + for _, c := range testText { + sqlQuery := "SELECT * FROM " + filepath.Join(dataDir, c[0]) + err := trd.Exec(ctx, sqlQuery) + if err != nil { + t.Errorf("trdsql error %s", err) + } + if outStream.String() != c[1] { + t.Fatalf("trdsql error %s:%s:%s", c[0], c[1], outStream) + } + outStream.Reset() + } +} + func setOutFormatTRDSQL(outFormat Format, outStream io.Writer) *TRDSQL { importer := NewImporter( InFormat(GUESS),