”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Go 的 `encoding/csv` 包向 CSV 文件中的引用字符串添加额外的引号?

为什么 Go 的 `encoding/csv` 包向 CSV 文件中的引用字符串添加额外的引号?

发布于2024-11-17
浏览:507

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

对 Go 中引用字符串的特殊 CSV 结果进行故障排除 Encoding/CSV

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 标准

问题的根源在于CSV(逗号分隔值)文件格式标准本身 根据该标准,字段中使用的双引号 (") 必须由两个双引号 ("") 表示。这是出于分析目的转义字符的一种方法。

A (double) quote character in a field must be represented by two (double) quote characters.
  • [Comma-分隔值 - 维基百科](https://en.wikipedia.org/wiki/Comma-separated_values)

影响关于 CSV 写作

将此规则应用于代码,用户确实通过使用 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标准本身,需要对双引号进行转义以进行解析。通过了解这种底层机制,您可以选择替代编码格式或手动处理字符串转义来实现您想要的结果。

最新教程 更多>
  • 如何在没有循环的情况下有效计算 Numpy 中一维数组的滚动标准差?
    如何在没有循环的情况下有效计算 Numpy 中一维数组的滚动标准差?
    在 Numpy 中实现一维数组的高效滚动窗口滚动窗口的概念涉及迭代数据序列并应用计算指定窗口长度内的数据子集。在给定的上下文中,任务是在不使用 Python 循环的情况下计算 Numpy 中一维数组的滚动标准差。虽然可以使用 Numpy.std 轻松获得标准差,但滚动窗口部分构成了一个挑战。然而,通...
    编程 发布于2024-11-17
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-17
  • 如何在 jQuery 中选择具有特定背景颜色的 Span?
    如何在 jQuery 中选择具有特定背景颜色的 Span?
    定位具有特定背景颜色的元素处理 div 内的跨度集合时,目标可能是隔离具有特定背景颜色的元素。虽然 [attribute=value] 选择器可能看起来很直观,但事实证明它对于根据背景颜色提取元素是无效的,因为 span 缺少该名称的属性。相反,请考虑 CSS 选择器 $('div# som...
    编程 发布于2024-11-17
  • 在 PHP 中使用绑定 SQL 变量如何提高代码安全性、性能和可维护性?
    在 PHP 中使用绑定 SQL 变量如何提高代码安全性、性能和可维护性?
    PHP 中的绑定 SQL 变量:指南尽管 SQL 字符串很流行,但您可以通过绑定变量来增强代码。这样做可以带来许多好处,包括提高安全性、性能和可维护性。在 PHP 中,绑定变量可以毫不费力地完成,使您能够编写更安全、更高效、更易读的代码。MySQL 和 PostgreSQL 绑定技术适用于 MySQ...
    编程 发布于2024-11-17
  • 如何使用 Go 的 pq 包将数据从 STDIN 导入到 PostgreSQL?
    如何使用 Go 的 pq 包将数据从 STDIN 导入到 PostgreSQL?
    如何将行从 STDIN 导入到 Postgresql? [重复]在 Go 中,您可以使用 pq 包将行从 STDIN 导入到 PostgreSQL。以下是分步解决方案:第 1 步:准备数据库连接import ( "database/sql" "githu...
    编程 发布于2024-11-17
  • 如何解决Python中类型提示的循环导入?
    如何解决Python中类型提示的循环导入?
    没有循环导入的 Python 中的类型提示在尝试将一个大类分成两个较小的类时,您会遇到循环问题进口。 “main”类导入 mixin 类,并且 mixin 类在其类型提示中引用“main”类。这会导致导入循环,导致类型提示无法正常工作。要解决此问题,可以考虑以下方法:# main.py from _...
    编程 发布于2024-11-17
  • 什么是 jQuery.fn?为什么它是 jQuery.prototype 的别名?
    什么是 jQuery.fn?为什么它是 jQuery.prototype 的别名?
    深入研究 jQuery.fn:原型的别名在 jQuery 库中,您可能会遇到神秘的 jQuery.fn。这个神秘的 fn 代表什么以及它有什么作用?Prototype 的作用在 JavaScript 领域,prototype 属性是一个至关重要的组成部分构造函数。当您使用特定构造函数创建实例时,该实...
    编程 发布于2024-11-17
  • 如何用Python实现高效的双向哈希表?
    如何用Python实现高效的双向哈希表?
    实现高效的双向哈希表双向哈希表允许键到值和值到键的查找。虽然 Python 的内置 dict 数据结构在键到值查找方面表现出色,但它并不能提供有效的值到键检索。实现双向哈希表的有效方法是利用类扩展了标准字典。此类名为 bidict,维护一个逆目录,该目录会根据对常规 dict 的任何修改自动更新。代...
    编程 发布于2024-11-17
  • PDOStatement::bindParam() 中的前导冒号真的是可选的吗?
    PDOStatement::bindParam() 中的前导冒号真的是可选的吗?
    PDOStatement::bindParam() 中参数名称的前导冒号是否真的可选?PDOStatement::bindParam() 允许您使用占位符(例如:name)在查询中指定命名参数。文档指出命名占位符的参数标识符应使用格式:name。然而,据观察,:name 和 name 似乎都可以使用...
    编程 发布于2024-11-17
  • 如何在 JavaScript 中实现稳定排序以在排序过程中保持元素顺序?
    如何在 JavaScript 中实现稳定排序以在排序过程中保持元素顺序?
    JavaScript中的稳定排序目标:基于键对对象数组进行高效排序,保持一致性和稳定性。算法推荐: 虽然存在许多排序算法,但为了满足您对稳定性的特定需求,请考虑实现非稳定排序算法,如 QuickSort 或 MergeSort。稳定排序技术:为了确保稳定性,请在排序比较函数中添加一个附加条件。具体来...
    编程 发布于2024-11-17
  • 掌握复合组件:构建灵活且可重用的 React 组件
    掌握复合组件:构建灵活且可重用的 React 组件
    介绍 React 世界中非常有用且全面的东西是它的设计模式,因为它们有助于保持代码的可扩展性并为我们创建的组件添加意义。 有多种模式,在本文中我们将讨论复合组件,这是一种高级模式,对于创建灵活的复合接口特别有用。 什么是复合组件? 复合组件是 React 中的一种高...
    编程 发布于2024-11-17
  • ## 双波形符运算符 (~~) 在 JavaScript 中有何作用?
    ## 双波形符运算符 (~~) 在 JavaScript 中有何作用?
    JavaScript 中的双波浪号运算符 (~~)在 JavaScript 中,~~ 运算符是一个类型强制运算符,它会删除 后面的所有内容数字的小数点。这与 ~ 运算符不同,~ 运算符是按位 NOT 运算符,可反转值的位。操作 运算符的工作原理是首先将其值转换为操作数为有符号 32 位整数。这意味着...
    编程 发布于2024-11-17
  • 如何在 Python 中执行模糊字符串比较?
    如何在 Python 中执行模糊字符串比较?
    Python 中的模糊字符串比较:有效模块在处理字符串中的潜在变化和错误时,需要进行模糊字符串比较。为这项任务找到合适的 Python 模块至关重要。这个问题寻求一个可以提供相似性百分比的模块,允许各种比较选项。 difflib: A Versatile Tool for Fuzzy Compari...
    编程 发布于2024-11-17
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-17
  • 如何设置 Go 测试的工作目录?
    如何设置 Go 测试的工作目录?
    Go 测试中的工作目录在 Go 中,通常将配置文件放置在工作目录中并在代码中引用它们。但是,如果测试环境与生产环境不匹配,单元测试可能无法找到这些文件。要为 Go 测试指定工作目录,请探索以下解决方案:考虑使用运行时包中的 Caller 函数。调用者获取当前的测试源文件并返回其路径。该路径可用于设置...
    编程 发布于2024-11-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3