>  기사  >  백엔드 개발  >  Go\의 CSV 작성기가 특수 문자가 포함된 인용 문자열에 추가 따옴표를 추가하는 이유는 무엇입니까?

Go\의 CSV 작성기가 특수 문자가 포함된 인용 문자열에 추가 따옴표를 추가하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-25 09:30:02186검색

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

Go에서 인용 문자열의 이상한 CSV 인코딩

이 코드 조각은 두 개의 레코드(따옴표가 없는 문자열과 인용 문자열이 있는 레코드)가 있는 CSV 파일을 생성하려고 시도합니다. 특수 문자가 포함된 문자열:

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

그러나 출력에는 인용된 문자열 주위에 추가 따옴표가 포함되어 있습니다.

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

설명

이 동작은 CSV의 결과입니다. 기준. 사양에 따르면 필드 내의 큰따옴표는 큰따옴표로 이스케이프되어야 합니다. 따라서 CSV 작성기는 인용된 문자열의 큰따옴표를 자동으로 이스케이프 처리합니다.

해결 방법

CSV 리더는 구문 분석 중에 큰따옴표를 자동으로 이스케이프 처리하므로 추가 따옴표에 대해 걱정할 필요가 없습니다. . 인용된 문자열은 다음과 같이 올바르게 해석됩니다.

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

다음은 불필요한 이스케이프를 제거한 향상된 버전의 코드입니다.

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

출력

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]

위 내용은 Go\의 CSV 작성기가 특수 문자가 포함된 인용 문자열에 추가 따옴표를 추가하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.