Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah penulis CSV Go menambah petikan tambahan pada rentetan petikan yang mengandungi aksara khas?

Mengapakah penulis CSV Go menambah petikan tambahan pada rentetan petikan yang mengandungi aksara khas?

Susan Sarandon
Susan Sarandonasal
2024-10-25 09:30:02186semak imbas

Why does Go's CSV writer add extra quotes to quoted strings containing special characters?

Pengekodan CSV Pelik bagi Rentetan Dipetik dalam Go

Coretan kod ini cuba mencipta fail CSV dengan dua rekod, satu dengan rentetan yang tidak dipetik dan satu lagi dengan petikan rentetan yang mengandungi aksara khas:

<code class="go">package main

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

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

    w := csv.NewWriter(f)
    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)

    record = make([]string, 0)
    record = append(record, "Quoted string")
    s = fmt.Sprintf("%q", s)
    record = append(record, s)
    fmt.Println(record)
    w.Write(record)

    w.Flush()
}</code>

Walau bagaimanapun, output mengandungi petikan tambahan yang mengelilingi rentetan yang disebut:

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

Penjelasan

Tingkah laku ini adalah akibat daripada CSV standard. Mengikut spesifikasi, petikan berganda dalam medan mesti dilepaskan dengan petikan berganda. Oleh itu, penulis CSV secara automatik melepaskan petikan berganda dalam rentetan yang dipetik.

Penyelesaian

Pembaca CSV secara automatik melepaskan petikan berganda semasa menghuraikan, jadi anda tidak perlu risau tentang petikan tambahan . Rentetan yang dipetik akan ditafsirkan dengan betul sebagai:

"Cr@zy text with , and \ and \" etc"

Contoh

Berikut ialah versi kod yang diperbaik dengan escape yang tidak perlu dialih keluar:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)
func checkError(e error){
    if e != nil {
        panic(e)
    }
}
func writeCSV(){
    fmt.Println("Writing csv")
    f, err := os.Create("./test.csv")
    checkError(err)
    defer f.Close()

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

    record = []string{ 
      "Quoted string",
      s,
    }
    fmt.Println(record)
    w.Write(record)
    w.Flush()
}
func readCSV(){
    fmt.Println("Reading csv")
    file, err := os.Open("./test.csv")
    defer file.Close();
    cr := csv.NewReader(file)
    records, err := cr.ReadAll()
    checkError(err)
    for _, record := range records {
        fmt.Println(record)
    }
}
func main() {
   writeCSV()
   readCSV()
}

Output

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

Atas ialah kandungan terperinci Mengapakah penulis CSV Go menambah petikan tambahan pada rentetan petikan yang mengandungi aksara khas?. 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