"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go\의 `encoding/csv` 패키지가 CSV 파일의 인용 문자열에 추가 따옴표를 추가하는 이유는 무엇입니까?

Go\의 `encoding/csv` 패키지가 CSV 파일의 인용 문자열에 추가 따옴표를 추가하는 이유는 무엇입니까?

2024년 11월 17일에 게시됨
검색:418

Why Does Go\'s `encoding/csv` Package Add Extra Quotes to Quoted Strings in CSV Files?

Go Encoding/CSV에서 인용 문자열에 대한 특이한 CSV 결과 문제 해결

Go의 인코딩/csv 패키지는 인용 문자열 처리와 관련하여 많은 논쟁의 대상이었습니다. CSV 파일로. 이 문서는 사용자가 CSV 파일에 인용된 문자열을 쓰는 동안 추가 인용문을 발견한 흥미로운 현상을 탐색하여 문제를 조명하는 것을 목표로 합니다.

추가 인용문의 수수께끼

사용자가 제공한 내용 문제를 설명하는 다음 코드 조각:

package main

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

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

    // Initialize a CSV writer
    w := csv.NewWriter(f)

    // Unquoted string
    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)

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

    // Flush the writer to save the changes
    w.Flush()
}

이 코드를 실행할 때 인용된 문자열의 예상 출력은 다음과 같습니다.

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

그러나 실제로 얻은 출력은 다음과 같습니다.

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

인용된 문자열 주위에 추가 따옴표가 있다는 것은 혼란스럽고 추가 조사가 필요했습니다.

CSV 표준 이해

문제의 근본 원인은 CSV(쉼표로 구분된 값) 파일 형식 표준에 있습니다. 표준에 따르면 필드 내에 사용되는 큰따옴표(")는 두 개의 큰따옴표("")로 표시되어야 합니다. 이는 구문 분석 목적으로 문자를 이스케이프하는 수단입니다.

A (double) quote character in a field must be represented by two (double) quote characters.
  • [Comma- 구분된 값 - Wikipedia](https://en.wikipedia.org/wiki/Comma-separated_values)

CSV 작성에 미치는 영향

이 규칙을 코드에 적용하면 사용자는 실제로 fmt.Sprintf("%q")를 사용하여 인용된 문자열 내의 인용 부호를 올바르게 이스케이프했습니다. 그러나 인코딩/csv 패키지는 surrou

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

이 추가 이스케이프는 필드가 필요한 CSV 표준을 준수하는 데 필요합니다. 선택적으로 큰따옴표로 묶어야 하며, 필드 내의 큰따옴표는 큰따옴표로 표시되어야 합니다.

추가 따옴표 방지

추가 따옴표는 CSV 인코딩 사양에 따라 추가되지만 대체 인코딩 형식을 선택하면 이를 피할 수 있습니다. 또는 CSV 표준을 엄격하게 따르려면 다음과 같이 각 작은 큰따옴표를 큰따옴표로 바꾸어 문자열을 수동으로 조작할 수 있습니다.

s = strings.ReplaceAll(s, `"`, `""`)

결론

Go의 인코딩/csv 패키지에서 CSV 파일에 인용 문자열을 쓰는 동안 관찰된 독특한 동작은 CSV 표준 자체에 기인할 수 있습니다. 이 기본 메커니즘을 이해하면 대체 인코딩 형식을 선택하거나 문자열 이스케이프를 수동으로 처리하여 원하는 결과를 얻을 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3