mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-30 03:01:39 +00:00
record_writer_csvlite.go
This commit is contained in:
parent
d17e4c1cc7
commit
ce23dfd317
3 changed files with 106 additions and 12 deletions
|
|
@ -568,7 +568,7 @@ func parseWriterOptions(args []string, argc int, pargi *int, writerOptions *clit
|
|||
argi += 1
|
||||
|
||||
} else if args[argi] == "--ocsvlite" {
|
||||
writerOptions.OutputFileFormat = "csv"
|
||||
writerOptions.OutputFileFormat = "csvlite"
|
||||
argi += 1
|
||||
|
||||
} else if args[argi] == "--otsv" {
|
||||
|
|
@ -576,11 +576,11 @@ func parseWriterOptions(args []string, argc int, pargi *int, writerOptions *clit
|
|||
writerOptions.OFS = "\t"
|
||||
argi += 1
|
||||
|
||||
// } else if args[argi] == "--otsvlite" {
|
||||
// writerOptions.OutputFileFormat = "csvlite";
|
||||
// writerOptions.OFS = "\t";
|
||||
// argi += 1;
|
||||
//
|
||||
} else if args[argi] == "--otsvlite" {
|
||||
writerOptions.OutputFileFormat = "csvlite"
|
||||
writerOptions.OFS = "\t"
|
||||
argi += 1
|
||||
|
||||
// } else if args[argi] == "--oasv" {
|
||||
// writerOptions.OutputFileFormat = "csv";
|
||||
// writerOptions.OFS = ASV_FS;
|
||||
|
|
@ -738,12 +738,13 @@ func parseReaderWriterOptions(
|
|||
writerOptions.OFS = "\t"
|
||||
argi += 1
|
||||
|
||||
// } else if args[argi] == "--tsvlite" || args[argi] == "-t" {
|
||||
// readerOptions.InputFileFormat = writerOptions.OutputFileFormat = "csvlite";
|
||||
// readerOptions.IFS = "\t";
|
||||
// writerOptions.OFS = "\t";
|
||||
// argi += 1;
|
||||
//
|
||||
} else if args[argi] == "--tsvlite" || args[argi] == "-t" {
|
||||
readerOptions.InputFileFormat = "csvlite"
|
||||
writerOptions.OutputFileFormat = "csvlite"
|
||||
readerOptions.IFS = "\t"
|
||||
writerOptions.OFS = "\t"
|
||||
argi += 1
|
||||
|
||||
// } else if args[argi] == "--asv" {
|
||||
// readerOptions.InputFileFormat = writerOptions.OutputFileFormat = "csv";
|
||||
// readerOptions.IFS = ASV_FS;
|
||||
|
|
|
|||
91
go/src/miller/output/record_writer_csvlite.go
Normal file
91
go/src/miller/output/record_writer_csvlite.go
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
package output
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"miller/clitypes"
|
||||
"miller/types"
|
||||
)
|
||||
|
||||
type RecordWriterCSVLite struct {
|
||||
ofs string
|
||||
ors string
|
||||
|
||||
doHeaderlessOutput bool
|
||||
// For reporting schema changes: we print a newline and the new header
|
||||
lastJoinedHeader *string
|
||||
// Only write one blank line for schema changes / blank input lines
|
||||
justWroteEmptyLine bool
|
||||
}
|
||||
|
||||
func NewRecordWriterCSVLite(writerOptions *clitypes.TWriterOptions) *RecordWriterCSVLite {
|
||||
|
||||
return &RecordWriterCSVLite{
|
||||
ofs: writerOptions.OFS,
|
||||
ors: writerOptions.ORS,
|
||||
|
||||
doHeaderlessOutput: writerOptions.HeaderlessCSVOutput,
|
||||
lastJoinedHeader: nil,
|
||||
justWroteEmptyLine: false,
|
||||
}
|
||||
}
|
||||
|
||||
func (this *RecordWriterCSVLite) Write(
|
||||
outrec *types.Mlrmap,
|
||||
) {
|
||||
// End of record stream: nothing special for this output format
|
||||
if outrec == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if outrec.FieldCount == 0 {
|
||||
if !this.justWroteEmptyLine {
|
||||
os.Stdout.WriteString("\n")
|
||||
}
|
||||
joinedHeader := ""
|
||||
this.lastJoinedHeader = &joinedHeader
|
||||
this.justWroteEmptyLine = true
|
||||
return
|
||||
}
|
||||
|
||||
needToPrintHeader := false
|
||||
joinedHeader := strings.Join(outrec.GetKeys(), ",")
|
||||
if this.lastJoinedHeader == nil || *this.lastJoinedHeader != joinedHeader {
|
||||
if this.lastJoinedHeader != nil {
|
||||
if !this.justWroteEmptyLine {
|
||||
os.Stdout.WriteString("\n")
|
||||
}
|
||||
this.justWroteEmptyLine = true
|
||||
}
|
||||
this.lastJoinedHeader = &joinedHeader
|
||||
needToPrintHeader = true
|
||||
}
|
||||
|
||||
if needToPrintHeader && !this.doHeaderlessOutput {
|
||||
var buffer bytes.Buffer // faster than fmt.Print() separately
|
||||
for pe := outrec.Head; pe != nil; pe = pe.Next {
|
||||
buffer.WriteString(*pe.Key)
|
||||
|
||||
if pe.Next != nil {
|
||||
buffer.WriteString(this.ofs)
|
||||
}
|
||||
}
|
||||
|
||||
buffer.WriteString(this.ors)
|
||||
os.Stdout.WriteString(buffer.String())
|
||||
}
|
||||
|
||||
var buffer bytes.Buffer // faster than fmt.Print() separately
|
||||
for pe := outrec.Head; pe != nil; pe = pe.Next {
|
||||
buffer.WriteString(pe.Value.String())
|
||||
if pe.Next != nil {
|
||||
buffer.WriteString(this.ofs)
|
||||
}
|
||||
}
|
||||
buffer.WriteString(this.ors)
|
||||
os.Stdout.WriteString(buffer.String())
|
||||
|
||||
this.justWroteEmptyLine = false
|
||||
}
|
||||
|
|
@ -8,6 +8,8 @@ func Create(writerOptions *clitypes.TWriterOptions) IRecordWriter {
|
|||
switch writerOptions.OutputFileFormat {
|
||||
case "csv":
|
||||
return NewRecordWriterCSV(writerOptions)
|
||||
case "csvlite":
|
||||
return NewRecordWriterCSVLite(writerOptions)
|
||||
case "dkvp":
|
||||
return NewRecordWriterDKVP(writerOptions)
|
||||
case "json":
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue