Go 中的encoding/csv 包一直是有关处理引用字符串的很多争论的主题在 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") 正确转义了引用字符串中的引号。然而,encoding/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, `"`, `""`)
在Go的encoding/csv包中将带引号的字符串写入CSV文件时观察到的特殊行为可以归因于CSV标准本身,需要对双引号进行转义以进行解析。通过了解这种底层机制,您可以选择替代编码格式或手动处理字符串转义来实现您想要的结果。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3