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(쉼표로 구분된 값) 파일 형식 표준에 있습니다. 표준에 따르면 필드 내에 사용되는 큰따옴표(")는 두 개의 큰따옴표("")로 표시되어야 합니다. 이는 구문 분석 목적으로 문자를 이스케이프하는 수단입니다.
A (double) quote character in a field must be represented by two (double) quote characters.
이 규칙을 코드에 적용하면 사용자는 실제로 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