في مقتطف التعليمات البرمجية هذا، الهدف هو كتابة البيانات في ملف 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