العمل مع CSV في Go (Golang): دليل كامل لـ encoding/csv

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع 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 — العدد المتوقع للحقول لكل سجل

توصيات