From 8a928d0e9c363c310e12483a632101c7a5a6afd9 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Wed, 19 Aug 2026 14:49:21 -0600 Subject: [PATCH] fix gsheet reader skip empty records --- io/transform/gsheet2csv/gsheet2csv.go | 11 +++++++++++ io/transform/gsheet2csv/gsheet2csv_test.go | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/io/transform/gsheet2csv/gsheet2csv.go b/io/transform/gsheet2csv/gsheet2csv.go index 75b0337..f2fad39 100644 --- a/io/transform/gsheet2csv/gsheet2csv.go +++ b/io/transform/gsheet2csv/gsheet2csv.go @@ -213,6 +213,17 @@ func (r *Reader) Read() ([]string, error) { return nil, err } + allEmpty := true + for _, field := range record { + if field != "" { + allEmpty = false + break + } + } + if allEmpty { + continue + } + if r.Comment > 0 { if rv, _ := utf8.DecodeRuneInString(record[0]); rv == r.Comment { last := len(record) - 1 diff --git a/io/transform/gsheet2csv/gsheet2csv_test.go b/io/transform/gsheet2csv/gsheet2csv_test.go index da706a0..2a96827 100644 --- a/io/transform/gsheet2csv/gsheet2csv_test.go +++ b/io/transform/gsheet2csv/gsheet2csv_test.go @@ -131,6 +131,23 @@ func TestNewReaderFromURL(t *testing.T) { } } +func TestReadSkipsEmptyRecords(t *testing.T) { + reader := NewReader(strings.NewReader("a,b\n,,\n\"\",\"\"\nvalue,\n")) + rows, err := reader.ReadAll() + if err != nil { + t.Fatal(err) + } + want := [][]string{{"a", "b"}, {"value", ""}} + if len(rows) != len(want) { + t.Fatalf("rows = %v, want %v", rows, want) + } + for i := range want { + if !slices.Equal(rows[i], want[i]) { + t.Fatalf("rows = %v, want %v", rows, want) + } + } +} + // TestRead tests the Read method for comment handling. func TestRead(t *testing.T) { tests := []struct {