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"""
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.
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"
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 := "Cr@zy text with , and \ and \" etc"
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()
}
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!