”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用“encoding/csv”将带引号的字符串写入 CSV 文件时,为什么我的 Go 代码会产生额外的引号?

使用“encoding/csv”将带引号的字符串写入 CSV 文件时,为什么我的 Go 代码会产生额外的引号?

发布于2024-11-12
浏览:463

Why does my Go code produce extra quotes when writing quoted strings to a CSV file using `encoding/csv`?

使用 Go 编码/CSV 引用字符串的奇怪 CSV 结果

在此代码片段中,目标是将数据写入 CSV 文件,确保引用的字符串在数据已正确转义。但是,生成的 CSV 包含额外的引号,导致不一致。

package main

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

func main() {
    f, err := os.Create("test.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    w := csv.NewWriter(f)
    record := []string{"Unquoted string", "Cr@zy text with , and \\ and \" etc"}
    w.Write(record)

    record = []string{"Quoted string", fmt.Sprintf("%q", "Cr@zy text with , and \\ and \" etc")}
    w.Write(record)

    w.Flush()
}

带引号的字符串的预期输出为:

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

但是,实际输出包含额外的引号:

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

理解额外引号

带引号的字符串是遵循 CSV 标准的结果,该标准要求将双引号转义为两个双引号。这是区分数据中实际双引号和用于记录分隔的双引号所必需的。

解决方案

代码不需要担心转义双引号,因为CSV 阅读器会自动对它们进行转义。因此解决办法就是在写带引号的字符串时去掉多余的双引号。

修改代码

for _, record := range [][]string{
    {"Unquoted string", "Cr@zy text with , and \\ and \" etc"},
    {"Quoted string", "Cr@zy text with , and \\ and \" etc"},
} {
    record[1] = fmt.Sprintf("%q", record[1][1:len(record[1])-1])
    w.Write(record)
}

更新输出

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

通过此更改,带引号的字符串现在已正确转义,并且删除了多余的引号。

最新教程 更多>
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-16
  • 快速浏览JNDI(Java命名和目录接口)
    快速浏览JNDI(Java命名和目录接口)
    简单的说,程序员可以使用同一个JNDI接口来查询以下内容 查找应用服务器提供的资源,例如数据源 搜索 LDAP 条目 查找 DNS 记录 简单介绍就到这里 代码 应用程序服务器的资源放置在“java:comp/env”前缀下。假设数据源位于 java:/comp/env/jdbc/d...
    编程 发布于2024-11-16
  • 为什么 `p.visible:last-of-type` 不定位最后一个可见段落元素?
    为什么 `p.visible:last-of-type` 不定位最后一个可见段落元素?
    :last-of-type 选择器行为:last-of-type 伪类目标指定类型的最后一个元素在父容器内。但是,在 CSS 选择器 (p.visible:last-of-type) 的上下文中,请务必注意 :last-of-type 仅适用于元素类型而不是类实例。在您的HTML 标记:<di...
    编程 发布于2024-11-16
  • 如何修复 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-16
  • 为什么 C 中基于指针和基于数组的字符串的“strlen”和“sizeof”产生不同的结果?
    为什么 C 中基于指针和基于数组的字符串的“strlen”和“sizeof”产生不同的结果?
    基于指针和基于数组的字符串初始化的字符串长度和大小计算的不同输出了解结果当创建具有相同值的基于指针的字符串 str1 和基于数组的字符串 str2 时,函数 strlen 和 sizeof 产生不同的结果。具体来说,对于声明:char *str1 = "Sanjeev"; cha...
    编程 发布于2024-11-16
  • C++ 中的强类型枚举可以自动转换为整数吗?
    C++ 中的强类型枚举可以自动转换为整数吗?
    自动将强类型枚举转换为整数在 C 中,枚举有两种类型:强类型枚举和常规枚举。常规枚举可以隐式转换为整数,而强类型枚举需要显式转换。这就提出了一个问题:是否有一种自动方法可以将强类型枚举转换为整数,而无需借助显式强制转换?答案是否定的,而且这是有意为之。强类型枚举旨在防止隐式转换为整数。本质上,编译器...
    编程 发布于2024-11-16
  • 如何使用 CSS 响应式地创建具有两个不同边框的圆?
    如何使用 CSS 响应式地创建具有两个不同边框的圆?
    响应式设计具有双边框的圆圈创建 CSS 圆圈非常简单,如提供的工作 CSS 所示。然而,要实现具有两个不同边框的圆,我们需要采用额外的 CSS 技术。使用提供的 HTML 结构,其中单个 元素代表圆:<div></div>我们可以如下修改CSS来创建一个有两个边框的圆:di...
    编程 发布于2024-11-16
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-11-16
  • 如何在单个 MySQL 操作中声明任务的所有权并检索其数据?
    如何在单个 MySQL 操作中声明任务的所有权并检索其数据?
    通过单个操作在 MySQL 中实现行所有权和数据检索:当使用多个工作程序应用程序循环执行任务时,它确保每个应用程序有效地声明对唯一任务的所有权可能具有挑战性。 MySQL 提供了 UPDATE 和 SELECT 命令来完成此操作,但单独执行它们可能会引入延迟和潜在的竞争条件。要简化该过程,请考虑以下...
    编程 发布于2024-11-16
  • 如何处理 ReactJS 中的 GET 请求重定向和 CORS 错误?
    如何处理 ReactJS 中的 GET 请求重定向和 CORS 错误?
    在 ReactJS 中处理 GET 请求重定向和 CORS 错误当 ReactJS 应用程序向服务器发送 GET 请求并接收时遇到 CORS 错误302 重定向可能是一个令人沮丧的问题。以下提供了此问题的解决方案:要解决您的场景中的 CORS 错误,其中 ReactJS 前端 (f.com) 请求路...
    编程 发布于2024-11-16
  • 如何在 React Router v4/v5 中创建嵌套路由?
    如何在 React Router v4/v5 中创建嵌套路由?
    React Router v4/v5 的嵌套路由嵌套路由允许您在 React 应用程序中创建用于导航的分层结构。在 React Router v4 和 v5 中,您可以通过使用 和 组件来实现这一点。示例考虑以下示例,我们希望将应用程序划分为前端和管理区域。<Match pattern=&...
    编程 发布于2024-11-16
  • 如何在 PHP 循环中创建动态变量?
    如何在 PHP 循环中创建动态变量?
    循环中的动态变量创建:综合答案要在循环中创建变量,您可以采用以下技术:1。基于循环计数器的变量:正如您所提到的,您希望变量随着每次循环迭代而递增。为此,您可以使用以下语法:for ( $counter = 1; $counter <= $aantalZitjesBestellen; $coun...
    编程 发布于2024-11-16
  • 如何衡量 Go 集成测试的测试覆盖率?
    如何衡量 Go 集成测试的测试覆盖率?
    确定 Go 集成测试中的测试覆盖率集成测试旨在评估整个系统的功能,通常通过模拟或控制外部依赖。然而,确定集成测试的测试覆盖率提出了独特的挑战。测量非包测试中的覆盖率在所描述的场景中,测试与包是分开的他们测试。因此, go test -cover 命令报告覆盖率为 0%。为了解决这个问题,可以使用 -...
    编程 发布于2024-11-16
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-16
  • C++ 程序员如何使用 NPAPI 开发强大的浏览器插件?
    C++ 程序员如何使用 NPAPI 开发强大的浏览器插件?
    制作浏览器插件:C 程序员指南增强网络浏览器的专业功能需要开发浏览器插件。然而,编写这些插件的过程提出了问题,特别是对于那些打算使用 C 为 Windows 编写插件的人。开发浏览器插件的关键在于利用 Netscape 插件应用程序编程接口 (NPAPI)。 NPAPI 使开发人员能够创建处理特定内...
    编程 发布于2024-11-16

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

Copyright© 2022 湘ICP备2022001581号-3