العمل مع CSV في Go (Golang): دليل شامل للتحليل والكتابة

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

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

ابدأ الدورة

العمل مع CSV في Go (Golang): التحليل والكتابة ومعالجة البيانات

CSV (قيم مفصولة بفواصل) هو أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في Go (Golang)، يتم العمل مع CSV بشكل أصلي من خلال الحزمة القياسية encoding/csv، مما يجعله أداة مريحة وفعالة. في هذه المقالة، سنشرح بالتفصيل كيفية قراءة وإنشاء ومعالجة ملفات CSV في Go، بما في ذلك العمل مع كميات كبيرة من البيانات، وضبط الفواصل، ومعالجة الأخطاء.



حزمة encoding/csv: الأساسيات

توفر حزمة encoding/csv نوعين رئيسيين: Reader لقراءة CSV و Writer للكتابة. وهي تدعم القواعد القياسية لـ CSV (RFC 4180) وتسمح بضبط المعلمات بمرونة، مثل الفاصل، والتعليقات، ومعالجة علامات الاقتباس.

للبدء، يكفي استيراد الحزمة:

import "encoding/csv"


قراءة ملف CSV

لننظر إلى مثال بسيط لقراءة ملف CSV سطرًا بسطر:

package main

import ( "encoding/csv" "fmt" "os")

func main() { // فتح الملف file, err := os.Open("data.csv") if err != nil { panic(err) } defer file.Close()

// إنشاء Reader reader := csv.NewReader(file)

// قراءة جميع السجلات records, err := reader.ReadAll() if err != nil { panic(err) }

// عرض البيانات for i, record := range records { fmt.Printf("السطر %d: %v", i, record) }}

هام: ReadAll() يقوم بتحميل الملف بأكمله في الذاكرة. للملفات الكبيرة، استخدم القراءة سطرًا بسطر عبر Read().



القراءة سطرًا بسطر لملفات CSV الكبيرة

لمعالجة كميات كبيرة من البيانات (غيغابايت)، استخدم القراءة التكرارية:

reader := csv.NewReader(file)for {    record, err := reader.Read()    if err != nil {        // نهاية الملف        if err.Error() == "EOF" {            break        }        panic(err)    }    // معالجة السجل    fmt.Println(record)}


الكتابة في ملف CSV

إنشاء ملف CSV سهل أيضًا:

package main

import ( "encoding/csv" "os")

func main() { file, err := os.Create("output.csv") if err != nil { panic(err) } defer file.Close()

writer := csv.NewWriter(file) defer writer.Flush() // هام: تفريغ المخزن المؤقت

// كتابة العناوين writer.Write([]string{"Name", "Age", "City"}) // كتابة البيانات writer.Write([]string{"Alice", "30", "Moscow"}) writer.Write([]string{"Bob", "25", "Saint Petersburg"})}

لا تنس استدعاء Flush() بعد جميع عمليات الكتابة، وإلا فقد تُفقد البيانات.



ضبط الفاصل ومعلمات أخرى

بشكل افتراضي، يتم استخدام الفاصلة، ولكن يمكنك تغيير الفاصل، على سبيل المثال، إلى الفاصلة المنقوطة (TSV — علامة تبويب):

reader := csv.NewReader(file)reader.Comma = ';'  // لـ TSV: '\\t'

// للكتابة:writer := csv.NewWriter(file)writer.Comma = ';'

معلمات مفيدة أخرى:

  • LazyQuotes — يسمح بعلامات الاقتباس في أماكن غير قياسية (افتراضيًا false)
  • FieldsPerRecord — التحقق من عدد الحقول (القيمة السالبة تعطل التحقق)
  • Comment — رمز التعليق (مثل '#')، يتم تخطي الأسطر التي تبدأ به
  • TrimLeadingSpace — إزالة المسافات تلقائيًا في بداية الحقول

مثال مع الإعدادات:

reader := csv.NewReader(file)reader.Comma = '\\t'reader.Comment = '#'reader.TrimLeadingSpace = true


معالجة الأخطاء والتحقق من الصحة

غالبًا ما تحتوي ملفات CSV على أخطاء: علامات اقتباس زائدة، عدم تطابق عدد

توصيات