From f369b15a5042a844599832dde9d00caf85a0014b Mon Sep 17 00:00:00 2001 From: Bongjun Jang Date: Thu, 27 Apr 2023 20:04:10 +0900 Subject: [PATCH 1/2] Adhere to RFC 4180 - line break (#1481) --- src/FSharp.Data.Csv.Core/CsvRuntime.fs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/FSharp.Data.Csv.Core/CsvRuntime.fs b/src/FSharp.Data.Csv.Core/CsvRuntime.fs index 489251cc8..0cd96ce57 100644 --- a/src/FSharp.Data.Csv.Core/CsvRuntime.fs +++ b/src/FSharp.Data.Csv.Core/CsvRuntime.fs @@ -447,6 +447,11 @@ type CsvFile<'RowType> use writer = writer + // RFC 4180 (https://www.rfc-editor.org/rfc/rfc4180) + // 2. Definition of the CSV Format + // Each record is located on a separated line, delimited by a line break CRLF + writer.NewLine <- "\r\n" + let nullSafeguard str = match str with | null -> String.Empty From d0a9884f85e3c4c5e4a2f61b49e70cb666f6980b Mon Sep 17 00:00:00 2001 From: Bongjun Jang Date: Thu, 27 Apr 2023 20:08:51 +0900 Subject: [PATCH 2/2] Update test case for line break change --- tests/FSharp.Data.Tests/CsvProvider.fs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/FSharp.Data.Tests/CsvProvider.fs b/tests/FSharp.Data.Tests/CsvProvider.fs index 673d456aa..98ed88a6f 100644 --- a/tests/FSharp.Data.Tests/CsvProvider.fs +++ b/tests/FSharp.Data.Tests/CsvProvider.fs @@ -124,7 +124,7 @@ let ``Can create type for small document``() = [] let ``CsvFile.Rows is re-entrant if the underlying stream is``() = - let csv = CsvFile.Load(Path.Combine(__SOURCE_DIRECTORY__, "Data/SmallTest.csv")) + let csv = CsvFile.Load(Path.Combine(__SOURCE_DIRECTORY__, "Data/SmallTest.csv")) let twice = [ yield! csv.Rows; yield! csv.Rows ] twice |> Seq.length |> should equal 6 @@ -465,7 +465,8 @@ let ``Parse single row with trailing newline``() = let ``Parse two rows``() = let rows = SimpleWithStrCsv.ParseRows("false,abc, 31\ntrue, def, 42") rows.Length |> should equal 2 - (new SimpleWithStrCsv(rows)).SaveToString() |> should equal ("Column1,ColumnB,Column3" + Environment.NewLine + "false,abc,31" + Environment.NewLine + "true, def,42" + Environment.NewLine) + (new SimpleWithStrCsv(rows)).SaveToString() |> should equal ("Column1,ColumnB,Column3" + "\r\n" + "false,abc,31" + "\r\n" + "true, def,42" + "\r\n") + // (new SimpleWithStrCsv(rows)).SaveToString() |> should equal ("Column1,ColumnB,Column3" + Environment.NewLine + "false,abc,31" + Environment.NewLine + "true, def,42" + Environment.NewLine) let [] csvWithDataEndingWithSeparator = """ Name|Company |Email|Password