Тип csv.ParseError
Тип csv.ParseError используется для представления ошибок,
которые могут возникнуть в процессе разбора CSV-данных
с помощью пакета encoding/csv. Он содержит информацию
о строке, столбце и типе ошибки, что помогает точно
определить место и причину проблемы в исходных данных.
Основные поля структуры: Line (номер строки),
Column (номер столбца) и Err (текст ошибки).
Синтаксис
type ParseError struct {
Line int
Column int
Err error
}
func (e *ParseError) Error() string
Поле Line содержит номер строки, в которой произошла
ошибка (нумерация начинается с 1). Поле Column
указывает номер столбца, где обнаружена проблема
(также с 1). Поле Err хранит текст ошибки в виде
интерфейса error, который можно распарсить
для получения деталей.
Пример
Давайте создадим некорректные CSV-данные с пропущенной закрывающей кавычкой и обработаем ошибку разбора:
package 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)
}
Результат выполнения кода:
"Error at line: 2, column: 1"
"Error: bare \" in non-quoted-field"
В данном примере ошибка возникла во второй строке в первом столбце из-за незакрытой кавычки.
Пример
Рассмотрим обработку ошибки при несоответствии количества полей в строках:
package 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)
}
}
Результат выполнения кода:
"[John 30]"
"Line: 2, Column: 1"
"Error type: wrong number of fields"
Здесь вторая строка содержит три поля, хотя ожидается два. Ошибка возникает при попытке прочитать вторую запись.
Пример
Покажем, как обработать ошибку парсинга при чтении
всех записей с помощью ReadAll:
package 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)
}
}
Результат выполнения кода:
"[1 Alice]"
"[2 Bob]"
"[3 Charlie]"
В этом примере данные корректны, поэтому ошибок не возникает, и все записи успешно выводятся.
Смотрите также
-
тип
csv.Reader,
который используется для чтения CSV-данных -
функцию
csv.Reader.Read,
которая читает одну запись из CSV -
функцию
csv.Reader.ReadAll,
которая читает все записи из CSV -
константу
csv.ErrFieldCount,
которая возвращается при несоответствии количества полей