Пакет кодирования/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 (значения, разделенные запятыми). Согласно стандарту, двойные кавычки (""), используемые в поле, должны быть представлены двумя двойными кавычками (""). Это средство экранирования символа для целей синтаксического анализа.
A (double) quote character in a field must be represented by two (double) quote characters.
Применяя это правило к коду, пользователь действительно поступил правильно экранирование кавычек внутри строки в кавычках с помощью 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