العمل مع CSV في Go (Golang): دليل شامل لحزمة encoding/csv

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

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

ابدأ الدورة

حزمة 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() // مهم! تفريغ المخزن المؤقت إلى الملف

// كتابة الرأس

توصيات