"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا ينتج كود Go الخاص بي علامات اقتباس إضافية عند كتابة سلاسل مقتبسة إلى ملف CSV باستخدام "encoding/csv"؟

لماذا ينتج كود Go الخاص بي علامات اقتباس إضافية عند كتابة سلاسل مقتبسة إلى ملف CSV باستخدام "encoding/csv"؟

تم النشر بتاريخ 2024-11-12
تصفح:868

Why does my Go code produce extra quotes when writing quoted strings to a CSV file using `encoding/csv`?

نتائج CSV غريبة للسلاسل المقتبسة باستخدام ترميز Go/CSV

في مقتطف التعليمات البرمجية هذا، الهدف هو كتابة البيانات في ملف CSV، مما يضمن وجود السلاسل المقتبسة داخل يتم هروب البيانات بشكل صحيح. ومع ذلك، يحتوي ملف CSV الناتج على علامات اقتباس إضافية، مما يؤدي إلى عدم الاتساق.

package main

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

func main() {
    f, err := os.Create("test.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    w := csv.NewWriter(f)
    record := []string{"Unquoted string", "Cr@zy text with , and \\ and \" etc"}
    w.Write(record)

    record = []string{"Quoted string", fmt.Sprintf("%q", "Cr@zy text with , and \\ and \" etc")}
    w.Write(record)

    w.Flush()
}

الإخراج المتوقع للسلسلة المقتبسة هو:

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

ومع ذلك، يحتوي الإخراج الفعلي على علامات اقتباس إضافية:

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

فهم الاقتباسات الإضافية

علامات الاقتباس الإضافية في السلسلة المقتبسة هي نتيجة لاتباع معيار CSV، الذي يتطلب تجاوز علامات الاقتباس المزدوجة كعلامتي اقتباس مزدوجتين. يعد هذا ضروريًا للتمييز بين علامات الاقتباس المزدوجة الفعلية داخل البيانات وتلك المستخدمة لترسيم حدود السجل.

الحل

لا يحتاج الكود إلى القلق بشأن الهروب من علامات الاقتباس المزدوجة لأنه يقوم قارئ CSV بإزالتها تلقائيًا. لذلك، الحل هو إزالة علامات الاقتباس المزدوجة الإضافية عند كتابة السلسلة المقتبسة.

الكود المعدل

for _, record := range [][]string{
    {"Unquoted string", "Cr@zy text with , and \\ and \" etc"},
    {"Quoted string", "Cr@zy text with , and \\ and \" etc"},
} {
    record[1] = fmt.Sprintf("%q", record[1][1:len(record[1])-1])
    w.Write(record)
}

الإخراج المحدث

سلسلة غير مقتبسة، نص Cr@zy مع و و \ و " إلخ سلسلة مقتبسة، "نص Cr@zy مع و و \\ و \" إلخ"
Unquoted string,Cr@zy text with , and \ and " etc
Quoted string,"Cr@zy text with , and \\ and \" etc"
مع هذا التغيير، تم الآن تجاوز السلسلة المقتبسة بشكل صحيح وإزالة علامات الاقتباس الإضافية.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3