Heim  >  Artikel  >  Backend-Entwicklung  >  Warum fügt der CSV-Writer von Go zusätzliche Anführungszeichen zu Zeichenfolgen in Anführungszeichen hinzu, die Sonderzeichen enthalten?

Warum fügt der CSV-Writer von Go zusätzliche Anführungszeichen zu Zeichenfolgen in Anführungszeichen hinzu, die Sonderzeichen enthalten?

Susan Sarandon
Susan SarandonOriginal
2024-10-25 09:30:02186Durchsuche

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

Seltsame CSV-Kodierung von Zeichenfolgen in Anführungszeichen in Go

Dieses Codefragment versucht, eine CSV-Datei mit zwei Datensätzen zu erstellen, einer mit einer Zeichenfolge ohne Anführungszeichen und der andere mit einer Zeichenfolge in Anführungszeichen Zeichenfolge mit Sonderzeichen:

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

Die Ausgabe enthält jedoch zusätzliche Anführungszeichen, die die in Anführungszeichen gesetzte Zeichenfolge umgeben:

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

Erklärung

Dieses Verhalten ist eine Folge der CSV Standard. Gemäß der Spezifikation müssen doppelte Anführungszeichen innerhalb eines Felds durch doppelte Anführungszeichen maskiert werden. Daher maskiert der CSV-Writer automatisch die doppelten Anführungszeichen in der Zeichenfolge in Anführungszeichen.

Lösung

Der CSV-Reader entfernt automatisch die doppelten Anführungszeichen während des Parsens, sodass Sie sich keine Gedanken über die zusätzlichen Anführungszeichen machen müssen . Die zitierte Zeichenfolge wird korrekt interpretiert als:

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

Beispiel

Hier ist eine verbesserte Version des Codes, bei der unnötige Escapezeichen entfernt wurden:

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()
}

Ausgabe

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]

Das obige ist der detaillierte Inhalt vonWarum fügt der CSV-Writer von Go zusätzliche Anführungszeichen zu Zeichenfolgen in Anführungszeichen hinzu, die Sonderzeichen enthalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn