Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa kod Go saya menghasilkan petikan tambahan apabila menulis rentetan petikan pada fail CSV menggunakan `pengekodan/csv`?

Mengapa kod Go saya menghasilkan petikan tambahan apabila menulis rentetan petikan pada fail CSV menggunakan `pengekodan/csv`?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-26 20:17:29700semak imbas

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

Hasil CSV Pelik untuk Rentetan Dipetik Menggunakan Pengekodan/CSV Go

Dalam coretan kod ini, matlamatnya adalah untuk menulis data ke dalam fail CSV, memastikan rentetan yang dipetik dalam data dilepaskan dengan betul. Walau bagaimanapun, CSV yang terhasil mengandungi petikan tambahan, yang membawa kepada ketidakkonsistenan.

<code class="go">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()
}</code>

Output yang dijangkakan untuk rentetan yang dipetik ialah:

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

Walau bagaimanapun, output sebenar mengandungi petikan tambahan:

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

Penyelesaian

Kod tidak perlu risau tentang melepaskan petikan berganda kerana pembaca CSV melepaskannya secara automatik. Oleh itu, penyelesaiannya adalah untuk mengalih keluar petikan berganda tambahan semasa menulis rentetan yang dipetik.

Kod Diubahsuai

Output Dikemas Kini

Dengan perubahan ini, rentetan petikan kini dilupuskan dengan betul dan petikan tambahan dialih keluar.
<code class="go">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)
}</code>

Atas ialah kandungan terperinci Mengapa kod Go saya menghasilkan petikan tambahan apabila menulis rentetan petikan pada fail CSV menggunakan `pengekodan/csv`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn