Тип csv.ParseError

Тип csv.ParseError используется для представления ошибок, которые могут возникнуть в процессе разбора CSV-данных с помощью пакета encoding/csv. Он содержит информацию о строке, столбце и типе ошибки, что помогает точно определить место и причину проблемы в исходных данных. Основные поля структуры: Line (номер строки), Column (номер столбца) и Err (текст ошибки).

Синтаксис

gotype ParseError struct {
  Line   int
  Column int
  Err  error
}

func (e *ParseError) Error() string

Поле Line содержит номер строки, в которой произошла ошибка (нумерация начинается с 1). Поле Column указывает номер столбца, где обнаружена проблема (также с 1). Поле Err хранит текст ошибки в виде интерфейса error, который можно распарсить для получения деталей.

Пример

Давайте создадим некорректные CSV-данные с пропущенной закрывающей кавычкой и обработаем ошибку разбора:

gopackage main

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

func main() {
  data := `name,age,city
  "John,30,New York
  Jane,25,Boston`

  reader := csv.NewReader(strings.NewReader(data))
  records, err := reader.ReadAll()

  if err != nil {
    if parseErr, ok := err.(*csv.ParseError); ok {
      fmt.Printf("Error at line: %d, column: %d\n", parseErr.Line, parseErr.Column)
      fmt.Println("Error:", parseErr.Err)
    } else {
      fmt.Println("Other error:", err)
    }
    return
  }

  fmt.Println(records)
}

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

go"Error at line: 2, column: 1"
"Error: bare \" in non-quoted-field"

В данном примере ошибка возникла во второй строке в первом столбце из-за незакрытой кавычки.

Пример

Рассмотрим обработку ошибки при несоответствии количества полей в строках:

gopackage main

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

func main() {
  data := `name,age
  John,30,Engineer
  Jane,25`

  reader := csv.NewReader(strings.NewReader(data))
  reader.FieldsPerRecord = 2

  for {
    record, err := reader.Read()

    if err != nil {
      if parseErr, ok := err.(*csv.ParseError); ok {
        fmt.Printf("Line: %d, Column: %d\n", parseErr.Line, parseErr.Column)
        fmt.Printf("Error type: %v\n", parseErr.Err)
      } else {
        fmt.Println("Other error:", err)
      }
      break
    }

    fmt.Println(record)
  }
}

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

go"[John 30]"
"Line: 2, Column: 1"
"Error type: wrong number of fields"

Здесь вторая строка содержит три поля, хотя ожидается два. Ошибка возникает при попытке прочитать вторую запись.

Пример

Покажем, как обработать ошибку парсинга при чтении всех записей с помощью ReadAll:

gopackage main

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

func main() {
  data := `id,name
  1,Alice
  2,Bob
  3,Charlie`

  reader := csv.NewReader(strings.NewReader(data))
  reader.Comment = '#'

  records, err := reader.ReadAll()

  if err != nil {
    switch e := err.(type) {
    case *csv.ParseError:
      fmt.Printf("Parse error at line %d, column %d: %v\n",
        e.Line, e.Column, e.Err)
    default:
      fmt.Printf("Unexpected error: %v\n", e)
    }
    return
  }

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

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

go"[1 Alice]"
"[2 Bob]"
"[3 Charlie]"

В этом примере данные корректны, поэтому ошибок не возникает, и все записи успешно выводятся.

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

  • тип csv.Reader,
    который используется для чтения CSV-данных
  • функцию csv.Reader.Read,
    которая читает одну запись из CSV
  • функцию csv.Reader.ReadAll,
    которая читает все записи из CSV
  • константу csv.ErrFieldCount,
    которая возвращается при несоответствии количества полей