Ошибка csv.ErrFieldCount

Ошибка csv.ErrFieldCount возвращается методами Read и ReadAll из пакета encoding/csv, когда количество полей в прочитанной строке не совпадает с количеством полей в первой строке CSV файла. Эта ошибка указывает на нарушение структуры CSV данных, что может привести к некорректной обработке информации.

Синтаксис

goerr := csv.ErrFieldCount

Причины возникновения

Ошибка возникает в следующих случаях:

go- Количество полей в строке отличается от количества полей в заголовке
- CSV файл содержит строки с разным количеством колонок
- Неправильно экранированы кавычки, что приводит к неправильному разбору полей

Пример с Read

Рассмотрим пример чтения CSV файла, где одна строка содержит другое количество полей:

gopackage main

import (
  "encoding/csv"
  "fmt"
  "strings"
)

func main() {
  data := `name,age,city
Alice,25,New York
Bob,30,Los Angeles
Charlie,35`
  reader := csv.NewReader(strings.NewReader(data))

  for {
    record, err := reader.Read()
    if err != nil {
      if err == csv.ErrFieldCount {
        fmt.Println("Field count mismatch:", err)
      } else {
        fmt.Println("Other error:", err)
      }
      break
    }
    fmt.Println(record)
  }
}

Результат выполнения кода:

go[Alice 25 New York]
[Bob 30 Los Angeles]
"Field count mismatch: record on line 4: wrong number of fields"

Пример с ReadAll

При использовании ReadAll ошибка возвращается после попытки прочитать все записи:

gopackage main

import (
  "encoding/csv"
  "fmt"
  "strings"
)

func main() {
  data := `id,name,value
1,item1,100
2,item2
3,item3,300`
  reader := csv.NewReader(strings.NewReader(data))

  records, err := reader.ReadAll()
  if err != nil {
    if err == csv.ErrFieldCount {
      fmt.Println("Error:", err)
      fmt.Println("Records read successfully before error:", len(records))
    } else {
      fmt.Println("Other error:", err)
    }
    return
  }

  for _, record := range records {
    fmt.Println(record)
  }
}

Результат выполнения кода:

go"Error: record on line 3: wrong number of fields"
"Records read successfully before error: 2"

Обработка ошибки

Для корректной обработки csv.ErrFieldCount рекомендуется проверять ошибку перед использованием данных:

gopackage main

import (
  "encoding/csv"
  "fmt"
  "strings"
)

func main() {
  data := `name,age,city
John,30,Chicago
Jane,28,San Francisco
Mike,45`
  reader := csv.NewReader(strings.NewReader(data))
  reader.FieldsPerRecord = -1 // Отключаем проверку количества полей

  records, err := reader.ReadAll()
  if err != nil {
    fmt.Println("Error reading CSV:", err)
    return
  }

  for i, record := range records {
    fmt.Printf("Record %d: %v (fields: %d)\n", i, record, len(record))
  }
}

Результат выполнения кода:

go"Record 0: [name age city] (fields: 3)"
"Record 1: [John 30 Chicago] (fields: 3)"
"Record 2: [Jane 28 San Francisco] (fields: 3)"
"Record 3: [Mike 45] (fields: 2)"

Смотрите также

  • структуру csv.Reader,
    которая предоставляет методы для чтения CSV данных
  • метод csv.Reader.Read,
    который читает одну запись из CSV
  • метод csv.Reader.ReadAll,
    который читает все записи из CSV
  • структуру csv.ParseError,
    которая представляет ошибки парсинга CSV