«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему пакет `encoding/csv` Go добавляет дополнительные кавычки к строкам в кавычках в файлах CSV?

Почему пакет `encoding/csv` Go добавляет дополнительные кавычки к строкам в кавычках в файлах CSV?

Опубликовано 17 ноября 2024 г.
Просматривать:540

Why Does Go\'s `encoding/csv` Package Add Extra Quotes to Quoted Strings in CSV Files?

Устранение неполадок с необычными результатами CSV для строк в кавычках в Go Encoding/CSV

Пакет кодирования/csv в Go был предметом многочисленных споров относительно обработки строк в кавычках. в CSV-файлах. Цель этой статьи — пролить свет на эту проблему, исследуя интригующий феномен, наблюдаемый пользователем, который столкнулся с дополнительными кавычками при записи строк в кавычках в файл CSV.

Загадка дополнительных кавычек

Пользователь предоставил следующий фрагмент кода, иллюстрирующий проблему:

package main

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

func main() {
    // Create a file to write CSV data
    f, err := os.Create("./test.csv")
    if err != nil {
        log.Fatal("Error: %s", err)
    }
    defer f.Close()

    // Initialize a CSV writer
    w := csv.NewWriter(f)

    // Unquoted string
    var record []string
    record = append(record, "Unquoted string")
    s := "Cr@zy text with , and \\ and \" etc"
    record = append(record, s)
    fmt.Println(record)
    w.Write(record)

    // Quoted string
    record = make([]string, 0)
    record = append(record, "Quoted string")
    s = fmt.Sprintf("%q", s)
    record = append(record, s)
    fmt.Println(record)
    w.Write(record)

    // Flush the writer to save the changes
    w.Flush()
}

При запуске этого кода ожидаемый результат для строки в кавычках будет следующим:

[Quoted string "Cr@zy text with , and \\ and \" etc"]

Однако на самом деле полученный результат был следующим:

[Quoted string,"""Cr@zy text with , and \\ and \"" etc"""]

Наличие дополнительных кавычек вокруг строки в кавычках вызвало недоумение и потребовало дальнейшего изучения.

Понимание стандарта CSV

Корень проблемы заключается в сам стандарт формата файла CSV (значения, разделенные запятыми). Согласно стандарту, двойные кавычки (""), используемые в поле, должны быть представлены двумя двойными кавычками (""). Это средство экранирования символа для целей синтаксического анализа.

A (double) quote character in a field must be represented by two (double) quote characters.
  • [Запятая- отдельные значения - Wikipedia](https://en.wikipedia.org/wiki/Comma-separated_values)

Влияние на запись CSV

Применяя это правило к коду, пользователь действительно поступил правильно экранирование кавычек внутри строки в кавычках с помощью fmt.Sprintf("%q"). Однако пакет кодирования/csv добавляет дополнительное экранирование с помощью surrou

[Unquoted string Cr@zy text with , and `\` and " etc]
[Quoted string `""""Cr@zy text with , and `\` and \"" etc""""`]

Это дополнительное экранирование необходимо для соблюдения стандарта CSV, который требует полей при необходимости заключаться в двойные кавычки, а двойные кавычки внутри полей должны быть представлены в виде двойных кавычек.

Избегание дополнительных кавычек

В то время как дополнительные кавычки добавляются в соответствии со спецификациями кодирования CSV, их можно избежать, выбрав альтернативный формат кодирования. В качестве альтернативы, если вы хотите строго следовать стандарту CSV, вы можете манипулировать строкой вручную, заменяя каждую одинарную двойную кавычку двойной двойной кавычкой, например:

s = strings.ReplaceAll(s, `"`, `""`)

Вывод

Необычное поведение, наблюдаемое при записи строк в кавычках в файлы CSV в пакете Gocoding/csv, можно объяснить к самому стандарту CSV, который требует экранирования двойных кавычек для синтаксического анализа. Понимая этот основной механизм, вы можете либо выбрать альтернативные форматы кодирования, либо вручную обрабатывать экранирование строк для достижения желаемых результатов.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3