feat(write): warn about standalone CR characters in header lines (#109)
* feat(write): warn about standalone CR characters in header lines * feat(write): add test for Windows CRLF line endings * chore: improve warning message Co-authored-by: Daniel Moran <danxmoran@gmail.com> * chore: update test with a new warning message Co-authored-by: Daniel Moran <danxmoran@gmail.com>
This commit is contained in:
@ -3,6 +3,7 @@ package csv2lp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
@ -144,6 +145,17 @@ func (state *CsvToLineReader) Read(p []byte) (n int, err error) {
|
|||||||
state.buffer = append(state.buffer, '\n')
|
state.buffer = append(state.buffer, '\n')
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
|
// detect non-standard line endings in header lines #106
|
||||||
|
for _, col := range row {
|
||||||
|
if idx := strings.Index(col, "\r"); idx >= 0 && idx+1 < len(col) && col[idx+1] != '\n' {
|
||||||
|
log.Println(
|
||||||
|
fmt.Sprintf("WARNING: %v. Only CRLF and LF line endings are supported.",
|
||||||
|
CsvLineError{state.LineNumber, errors.New("standalone CR character found")},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
state.dataRowAdded = false
|
state.dataRowAdded = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -424,3 +424,61 @@ cpu;3a
|
|||||||
// 8 lines were read
|
// 8 lines were read
|
||||||
require.Equal(t, 8, reader.LineNumber)
|
require.Equal(t, 8, reader.LineNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test_CsvToLineProtocol_LineEndingWarning checks correct logging of exotic line ending
|
||||||
|
func Test_CsvToLineProtocol_LineEndingWarning(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
log.SetOutput(&buf)
|
||||||
|
oldFlags := log.Flags()
|
||||||
|
log.SetFlags(0)
|
||||||
|
oldPrefix := log.Prefix()
|
||||||
|
prefix := "::PREFIX::"
|
||||||
|
log.SetPrefix(prefix)
|
||||||
|
defer func() {
|
||||||
|
log.SetOutput(os.Stderr)
|
||||||
|
log.SetFlags(oldFlags)
|
||||||
|
log.SetPrefix(oldPrefix)
|
||||||
|
}()
|
||||||
|
|
||||||
|
csv := "#datatype dateTime:number,string,tag,double,measurement\r" +
|
||||||
|
"time,sensor_id,parent,average,m\r" +
|
||||||
|
"1549240000000000000,xx:xx:xx:xx:xx:xx,2nd Floor Open Plan DS,0,test"
|
||||||
|
|
||||||
|
reader := CsvToLineProtocol(strings.NewReader(csv))
|
||||||
|
bytes, _ := ioutil.ReadAll(reader)
|
||||||
|
|
||||||
|
out := buf.String()
|
||||||
|
messages := strings.Count(out, prefix)
|
||||||
|
require.Equal(t, messages, 1)
|
||||||
|
require.Contains(t, out, "line 1")
|
||||||
|
require.Contains(t, out, "standalone CR character found. Only CRLF and LF line endings are supported.")
|
||||||
|
require.Empty(t, bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test_CsvToLineProtocol_WindowsLineEndings checks CRLF line endings
|
||||||
|
func Test_CsvToLineProtocol_WindowsLineEndings(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
log.SetOutput(&buf)
|
||||||
|
oldFlags := log.Flags()
|
||||||
|
log.SetFlags(0)
|
||||||
|
oldPrefix := log.Prefix()
|
||||||
|
prefix := "::PREFIX::"
|
||||||
|
log.SetPrefix(prefix)
|
||||||
|
defer func() {
|
||||||
|
log.SetOutput(os.Stderr)
|
||||||
|
log.SetFlags(oldFlags)
|
||||||
|
log.SetPrefix(oldPrefix)
|
||||||
|
}()
|
||||||
|
|
||||||
|
csv := "#datatype dateTime:number,string,tag,double,measurement\r\n" +
|
||||||
|
"time,sensor_id,parent,average,m\r\n" +
|
||||||
|
"1549240000000000000,a,b,0,test"
|
||||||
|
|
||||||
|
reader := CsvToLineProtocol(strings.NewReader(csv))
|
||||||
|
bytes, _ := ioutil.ReadAll(reader)
|
||||||
|
|
||||||
|
out := buf.String()
|
||||||
|
messages := strings.Count(out, prefix)
|
||||||
|
require.Equal(t, messages, 0)
|
||||||
|
require.Equal(t, string(bytes), "test,parent=b sensor_id=\"a\",average=0 1549240000000000000\n")
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user