العمل مع CSV في Go (Golang): دليل كامل
CSV (قيم مفصولة بفواصل) هو أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في لغة Go (Golang)، يتم تنظيم العمل مع CSV من خلال الحزمة القياسية encoding/csv. توفر واجهة مريحة وفعالة لقراءة وكتابة ملفات CSV، وتدعم ضبط الفواصل، وهروب الأحرف، ومعالجة الأخطاء.
في هذه المقالة، سنشرح بالتفصيل جميع إمكانيات حزمة encoding/csv من خلال أمثلة عملية. ستتعلم كيفية قراءة ملفات CSV سطرًا بسطر أو كاملة، وكتابة البيانات، وضبط إعدادات التحليل، ومعالجة الأخطاء النموذجية.
التثبيت والاستيراد
حزمة encoding/csv مضمنة في المكتبة القياسية لـ Go، لذا لا يلزم تثبيت إضافي. للاستخدام، يكفي استيرادها في الكود الخاص بك:
import ( "encoding/csv" "fmt" "os")قراءة ملفات CSV
أبسط طريقة لقراءة CSV هي استخدام csv.NewReader وطريقة ReadAll، التي تعيد جميع السجلات كمصفوفة من مصفوفات السلاسل النصية.
func readAllExample(filename string) { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close()
reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { panic(err) }
for _, record := range records { fmt.Println(record) }}بالنسبة للملفات الكبيرة، من الأفضل استخدام القراءة سطرًا بسطر عبر طريقة Read لتجنب تحميل الملف بأكمله في الذاكرة:
func readLineByLine(filename string) { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close()
reader := csv.NewReader(file) reader.LazyQuotes = true // يسمح بتحليل غير صارم للاقتباسات
for { record, err := reader.Read() if err != nil { break // نهاية الملف أو خطأ } fmt.Println(record) }}كتابة ملفات CSV
لكتابة البيانات، يُستخدم csv.NewWriter. طريقة Write تكتب سجلاً واحدًا، بينما WriteAll تكتب الكل مرة واحدة. لا تنسَ استدعاء Flush() لتفريغ المخزن المؤقت.
func writeExample(filename string) { file, err := os.Create(filename) if err != nil { panic(err) } defer file.Close()
writer := csv.NewWriter(file) defer writer.Flush()
data := [][]string{ {"الاسم", "العمر", "المدينة"}, {"آنا", "28", "موسكو"}, {"إيفان", "35", "سانت بطرسبرغ"}, }
for _, record := range data { if err := writer.Write(record); err != nil { panic(err) } }}ضبط الفاصل والهروب
بشكل افتراضي، تستخدم encoding/csv الفاصلة كفاصل وعلامات الاقتباس المزدوجة للهروب. يمكنك تغيير هذه الإعدادات من خلال حقول هيكل Reader و Writer:
func customSettings() { // قراءة TSV (قيم مفصولة بعلامة تبويب) file, _ := os.Open("data.tsv") defer file.Close()
reader := csv.NewReader(file) reader.Comma = '\\t' // علامة تبويب بدلاً من الفاصلة reader.Comment = '#' // تجاهل الأسطر التي تبدأ بـ #
records, _ := reader.ReadAll() fmt.Println(records)}الحقول المفيدة للتخصيص:
Comma— رمز الفاصل (افتراضيًا ',')Comment— رمز التعليق (يتم تجاهل الأسطر التي تبدأ بهذا الرمز)LazyQuotes— يسمح بتحليل غير صارم للاقتباساتTrimLeadingSpace— يزيل المسافات في بداية الحقولFieldsPerRecord— العدد المتوقع للحقول لكل سجل