「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go の「encoding/csv」パッケージが CSV ファイル内の引用符で囲まれた文字列に余分な引用符を追加するのはなぜですか?

Go の「encoding/csv」パッケージが CSV ファイル内の引用符で囲まれた文字列に余分な引用符を追加するのはなぜですか?

2024 年 11 月 17 日に公開
ブラウズ:880

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

Go エンコーディング/CSV の引用符で囲まれた文字列に対する特異な CSV 結果のトラブルシューティング

Go のエンコーディング/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 (カンマ区切り値) ファイル形式標準にあります標準に従って、フィールド内で使用される二重引用符 (") は 2 つの二重引用符 ("") で表す必要があります。これは、解析目的で文字をエスケープする手段です。

A (double) quote character in a field must be represented by two (double) quote characters.
  • [Comma-区切り値 - Wikipedia](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 のエンコーディング/csv パッケージで引用符で囲まれた文字列を CSV ファイルに書き込むときに観察される奇妙な動作は、CSV 標準自体に起因している可能性があります。解析のためにエスケープされる二重引用符 この基本的なメカニズムを理解することで、代替のエンコード形式を選択するか、文字列のエスケープを手動で処理して目的の結果を得ることができます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3