From c1958bafb80410c5e9130777214a6479585312d1 Mon Sep 17 00:00:00 2001 From: nxshock Date: Tue, 21 May 2024 21:06:09 +0500 Subject: [PATCH] Enable lazy quotes for CSV files --- readercsv.go | 1 + readercsv_test.go | 34 +++++++++++++++++++ .../csv/9729337841_20032023_084313668.csv | 3 ++ 3 files changed, 38 insertions(+) create mode 100644 testdata/csv/9729337841_20032023_084313668.csv diff --git a/readercsv.go b/readercsv.go index 07e7645..e0e3871 100644 --- a/readercsv.go +++ b/readercsv.go @@ -35,6 +35,7 @@ func newCsvReader(r io.Reader, options *Options) (*CsvReader, error) { re := csv.NewReader(bufReader) re.Comma = options.comma re.FieldsPerRecord = len(options.fieldsTypes) + re.LazyQuotes = true csvReader := &CsvReader{ reader: re, diff --git a/readercsv_test.go b/readercsv_test.go index b1c30b6..3a3b01a 100644 --- a/readercsv_test.go +++ b/readercsv_test.go @@ -40,3 +40,37 @@ func TestCsvReaderBasic(t *testing.T) { err = csvReader.Close() assert.NoError(t, err) } + +func TestCsvReaderBasicQuotes(t *testing.T) { + f, err := os.Open("testdata/csv/9729337841_20032023_084313668.csv") + assert.NoError(t, err) + + options := &Options{ + encoding: "utf8", + comma: rune(";"[0]), + fieldsTypes: "s ", + dateFormat: "02.01.2006", + timestampFormat: "02.01.2006 15:04:05", + timezone: time.Local} + + csvReader, err := NewCsvReader(f, options) + assert.NoError(t, err) + + assert.Equal(t, []string{"Территориальный банк"}, csvReader.GetHeader()) + + row, err := csvReader.GetRow(false) + assert.NoError(t, err) + + assert.Equal(t, []any{`ПАО "Сбербанк"`}, row) + + row, err = csvReader.GetRow(false) + assert.NoError(t, err) + + assert.Equal(t, []any{`ПАО "Сбербанк"`}, row) + + _, err = csvReader.GetRow(false) + assert.Equal(t, err, io.EOF) + + err = csvReader.Close() + assert.NoError(t, err) +} diff --git a/testdata/csv/9729337841_20032023_084313668.csv b/testdata/csv/9729337841_20032023_084313668.csv new file mode 100644 index 0000000..163d822 --- /dev/null +++ b/testdata/csv/9729337841_20032023_084313668.csv @@ -0,0 +1,3 @@ +Территориальный банк;ГОСБ;Номер мерчанта;Наименование ТСТ;Номер терминала;Дата операции;Дата ПП;Сумма операции;Сумма расчета;Номер карты;Код авторизации;Тип операции;Доп. информация_1;Доп. информация_2 +"ПАО ""Сбербанк""";Киевское ОСБ;781000815902;WINK;28403560;19.03.2023 17:49:35;20.03.2023 00:00:00;499,00;488,52;522598******7141;REZE64;Покупка;35068281112;307817403283 +ПАО "Сбербанк";Киевское ОСБ;781000815902;WINK;28403560;19.03.2023 17:49:35;20.03.2023 00:00:00;499,00;488,52;522598******7141;REZE64;Покупка;35068281112;307817403283