diff options
author | Joe Tsai <joetsai@digital-static.net> | 2017-12-01 11:41:46 -0800 |
---|---|---|
committer | Joe Tsai <thebrokentoaster@gmail.com> | 2017-12-05 18:44:31 +0000 |
commit | 0b3b5113c0bbc62306a0404b235cbdf5a431bf67 (patch) | |
tree | 30be829df15b36ba219cd618cd01d39d639ebe3b /src/encoding/csv | |
parent | 8f2a9267c814538485dd3459910bc8e6de2ef2bb (diff) | |
download | go-0b3b5113c0bbc62306a0404b235cbdf5a431bf67.tar.gz go-0b3b5113c0bbc62306a0404b235cbdf5a431bf67.zip |
encoding/csv: truncate carriage returns at EOF
This fixes a regression where only CRLF was folded into LF at EOF.
Now, we also truncate trailing CR at EOF to preserve the old behavior.
Every one of the test cases added exactly matches the behavior
of Go1.9, even if the results are somewhat unexpected.
Fixes #22937
Change-Id: I1bc6550533163ae489ea77ec1e598163267b7eec
Reviewed-on: https://go-review.googlesource.com/81577
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/encoding/csv')
-rw-r--r-- | src/encoding/csv/reader.go | 4 | ||||
-rw-r--r-- | src/encoding/csv/reader_test.go | 38 |
2 files changed, 41 insertions, 1 deletions
diff --git a/src/encoding/csv/reader.go b/src/encoding/csv/reader.go index 1350f3ebdd..2efc7ad094 100644 --- a/src/encoding/csv/reader.go +++ b/src/encoding/csv/reader.go @@ -224,6 +224,10 @@ func (r *Reader) readLine() ([]byte, error) { } if len(line) > 0 && err == io.EOF { err = nil + // For backwards compatibility, drop trailing \r before EOF. + if line[len(line)-1] == '\r' { + line = line[:len(line)-1] + } } r.numLine++ // Normalize \r\n to \n on all input lines. diff --git a/src/encoding/csv/reader_test.go b/src/encoding/csv/reader_test.go index d62aa77382..1fc69f9ab8 100644 --- a/src/encoding/csv/reader_test.go +++ b/src/encoding/csv/reader_test.go @@ -246,7 +246,43 @@ x,,, }, { Name: "TrailingCR", Input: "field1,field2\r", - Output: [][]string{{"field1", "field2\r"}}, + Output: [][]string{{"field1", "field2"}}, + }, { + Name: "QuotedTrailingCR", + Input: "\"field\"\r", + Output: [][]string{{"field"}}, + }, { + Name: "QuotedTrailingCRCR", + Input: "\"field\"\r\r", + Error: &ParseError{StartLine: 1, Line: 1, Column: 6, Err: ErrQuote}, + }, { + Name: "FieldCR", + Input: "field\rfield\r", + Output: [][]string{{"field\rfield"}}, + }, { + Name: "FieldCRCR", + Input: "field\r\rfield\r\r", + Output: [][]string{{"field\r\rfield\r"}}, + }, { + Name: "FieldCRCRLF", + Input: "field\r\r\nfield\r\r\n", + Output: [][]string{{"field\r"}, {"field\r"}}, + }, { + Name: "FieldCRCRLFCR", + Input: "field\r\r\n\rfield\r\r\n\r", + Output: [][]string{{"field\r"}, {"\rfield\r"}}, + }, { + Name: "FieldCRCRLFCRCR", + Input: "field\r\r\n\r\rfield\r\r\n\r\r", + Output: [][]string{{"field\r"}, {"\r\rfield\r"}, {"\r"}}, + }, { + Name: "MultiFieldCRCRLFCRCR", + Input: "field1,field2\r\r\n\r\rfield1,field2\r\r\n\r\r,", + Output: [][]string{ + {"field1", "field2\r"}, + {"\r\rfield1", "field2\r"}, + {"\r\r", ""}, + }, }, { Name: "NonASCIICommaAndComment", Input: "a£b,c£ \td,e\n€ comment\n", |