From 325957f425a4b17b01409e7125febdf19fdf3da4 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Thu, 7 Aug 2025 18:29:53 +0900 Subject: [PATCH 1/2] Disable Field count validation of CSV viewer Default behaviour rejected all rows (Records) with more or fewer columns (Fields) than the first row, preventing them from rendering at all and silently hiding them. --- modules/csv/csv.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/csv/csv.go b/modules/csv/csv.go index f1ca3b0923029..ad61b81d6995b 100644 --- a/modules/csv/csv.go +++ b/modules/csv/csv.go @@ -30,6 +30,8 @@ func CreateReader(input io.Reader, delimiter rune) *stdcsv.Reader { // thus would change `\t\t` to just `\t` or ` ` (two spaces) to just ` ` (single space) rd.TrimLeadingSpace = true } + // Don't force validation of every row to have the same number of entries as the first row. + rd.FieldsPerRecord = -1 return rd } From 021dccd86dcd46dafcf0868db6f1528a51e7bca4 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Thu, 7 Aug 2025 20:39:49 +0900 Subject: [PATCH 2/2] Update unit test --- modules/csv/csv_test.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/modules/csv/csv_test.go b/modules/csv/csv_test.go index be9fc5f823787..5ea9718466268 100644 --- a/modules/csv/csv_test.go +++ b/modules/csv/csv_test.go @@ -94,6 +94,24 @@ j, ,\x20 }, expectedDelimiter: ',', }, + // case 3 - every delimiter used, default to comma and handle differing number of fields per record + { + csv: `col1,col2 +a;b +c@e +f g +h|i +jkl`, + expectedRows: [][]string{ + {"col1", "col2"}, + {"a;b"}, + {"c@e"}, + {"f g"}, + {"h|i"}, + {"jkl"}, + }, + expectedDelimiter: ',', + }, } for n, c := range cases { @@ -119,21 +137,6 @@ func TestDetermineDelimiterShortBufferError(t *testing.T) { assert.Nil(t, rd, "CSV reader should be mnil") } -func TestDetermineDelimiterReadAllError(t *testing.T) { - rd, err := CreateReaderAndDetermineDelimiter(nil, strings.NewReader(`col1,col2 - a;b - c@e - f g - h|i - jkl`)) - assert.NoError(t, err, "CreateReaderAndDetermineDelimiter() shouldn't throw error") - assert.NotNil(t, rd, "CSV reader should not be mnil") - rows, err := rd.ReadAll() - assert.Error(t, err, "RaadAll() should throw error") - assert.ErrorIs(t, err, csv.ErrFieldCount) - assert.Empty(t, rows, "rows should be empty") -} - func TestDetermineDelimiter(t *testing.T) { cases := []struct { csv string