حزمة encoding/csv في Go: دليل شامل للعمل مع ملفات CSV
لا يزال تنسيق CSV (قيم مفصولة بفواصل) أحد أكثر الطرق شيوعًا لتبادل البيانات الجدولية. في Go (Golang)، للعمل مع هذا التنسيق، توجد حزمة قياسية encoding/csv توفر واجهة مريحة وفعالة لقراءة وكتابة ملفات CSV. في هذه المقالة، سنشرح بالتفصيل جميع إمكانيات الحزمة، من العمليات الأساسية إلى التقنيات المتقدمة.
الإمكانيات الأساسية لحزمة encoding/csv
حزمة encoding/csv مضمنة في المكتبة القياسية لـ Go ولا تتطلب تثبيت تبعيات إضافية. وهي تدعم:
- قراءة ملفات CSV بفواصل قابلة للتخصيص
- كتابة البيانات بتنسيق CSV
- معالجة علامات الاقتباس وهروب الأحرف الخاصة
- العمل مع رؤوس الأعمدة
- القراءة البطيئة (المعالجة التدفقية للملفات الكبيرة)
قراءة ملفات CSV في Go
لقراءة ملف CSV، يُستخدم هيكل csv.Reader. لنلقِ نظرة على مثال أساسي:
package main
import ( "encoding/csv" "fmt" "log" "os")
func main() { // فتح ملف CSV file, err := os.Open("data.csv") if err != nil { log.Fatal("خطأ في فتح الملف:", err) } defer file.Close()
// إنشاء قارئ CSV جديد reader := csv.NewReader(file)
// قراءة جميع السجلات مرة واحدة records, err := reader.ReadAll() if err != nil { log.Fatal("خطأ في قراءة CSV:", err) }
// عرض البيانات for i, record := range records { fmt.Printf("السطر %d: %v", i+1, record) }}القراءة التدفقية للملفات الكبيرة
لمعالجة ملفات CSV الكبيرة (مئات الميغابايت أو أكثر)، يُوصى باستخدام القراءة سطرًا سطرًا:
func readLargeCSV(filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close()
reader := csv.NewReader(file) // تخطي الرأس header, err := reader.Read() if err != nil { return err } fmt.Println("الرؤوس:", header)
// القراءة سطرًا سطرًا lineCount := 0 for { record, err := reader.Read() if err != nil { break // نهاية الملف } // معالجة السجل fmt.Printf("السطر %d: %s | %s", lineCount+1, record[0], record[1]) lineCount++ } return nil}تخصيص محلل CSV
تسمح حزمة encoding/csv بتخصيص معلمات القراءة بمرونة:
Comma— رمز الفاصل (افتراضيًا الفاصلة)Comment— رمز التعليق (الأسطر التي تبدأ به يتم تجاهلها)FieldsPerRecord— العدد المتوقع للحقول في السجلLazyQuotes— السماح بعلامات الاقتباس غير المهربةTrimLeadingSpace— إزالة المسافات في بداية الحقول
func customCSVParser() { file, _ := os.Open("custom.csv") defer file.Close()
reader := csv.NewReader(file) reader.Comma = ';' // استخدام الفاصلة المنقوطة reader.Comment = '#' // الأسطر التي تبدأ بـ # يتم تجاهلها reader.TrimLeadingSpace = true reader.LazyQuotes = true
records, _ := reader.ReadAll() for _, record := range records { fmt.Println(record) }}كتابة البيانات بتنسيق CSV
للكتابة، يُستخدم هيكل csv.Writer. مثال على إنشاء ملف CSV:
func writeCSV(filename string) error { file, err := os.Create(filename) if err != nil { return err } defer file.Close()
writer := csv.NewWriter(file) defer writer.Flush() // مهم! تفريغ المخزن المؤقت إلى الملف
// كتابة الرأس