0Pricing
Go Academy · درس

بث JSON وCSV

‏json.Decoder وencoding/csv للبيانات الكبيرة

بث JSON وCSV درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

لماذا المعالجة المتدفقة؟

يؤدي تحميل ملفات JSON أو CSV الكبيرة بالكامل إلى الذاكرة إلى استهلاك كبير للذاكرة الديناميكية. وتعالج المعالجة المتدفقة السجلات واحدًا تلو الآخر، فتحافظ على استهلاك ثابت للذاكرة بصرف النظر عن حجم الملف.

json.Decoder للمعالجة المتدفقة

تغلّف json.NewDecoder أي io.Reader. استخدموا Token() للتنقل في دفق رموز JSON، أو استخدموا Decode داخل حلقة لمصفوفات JSON.

dec := json.NewDecoder(file)
// consume opening [
for dec.More() {
    var record Record
    dec.Decode(&record)
    process(record)
}

اكتشاف بداية المصفوفة

استدعوا dec.Token() لاستهلاك القوس الافتتاحي قبل حلقة فك الترميز:

t, _ := dec.Token() // consume [
for dec.More() {
    var r Record
    dec.Decode(&r)
}

المعالجة المتدفقة من HTTP

فكّوا ترميز JSON مباشرةً من جسم استجابة HTTP دون تخزين الاستجابة كاملةً مؤقتًا:

resp, _ := http.Get(url)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
for dec.More() {
    var item Item
    dec.Decode(&item)
    process(item)
}

قارئ encoding/csv

يقرأ csv.NewReader صفوف CSV واحدًا تلو الآخر. اضبطوا LazyQuotes وTrimLeadingSpace وComment للتعامل مع تنويعات CSV الواقعية.

r := csv.NewReader(file)
for {
    record, err := r.Read()
    if err == io.EOF { break }
    if err != nil { return err }
    process(record)
}

تخطي ترويسة CSV

اقرؤوا السجل الأول وتجاهلوه لتخطي صف الترويسة:

r.Read() // discard header
for {
    record, err := r.Read()
    if err == io.EOF { break }
}

csv.Writer

اكتبوا صفوف CSV واحدًا تلو الآخر باستخدام csv.NewWriter. استدعوا دائمًا w.Flush() وافحصوا w.Error() بعد الكتابة.

w := csv.NewWriter(file)
w.Write([]string{"name", "age"})
w.Flush()
if err := w.Error(); err != nil { return err }

محدِّد مخصص

تستخدم ملفات CSV أحيانًا الفواصل المنقوطة أو علامات التبويب. اضبطوا r.Comma على الرمز المطلوب.

r := csv.NewReader(file)
r.Comma = ';' // semicolon-separated

أسطر JSON المتدفقة (NDJSON)

يُعدّ JSON المحدد بأسطر جديدة، أي كائن JSON واحدًا لكل سطر، سهل المعالجة المتدفقة: اقرؤوا سطرًا سطرًا وفكّوا ترميز كل سطر على حدة.

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    var record Record
    json.Unmarshal(scanner.Bytes(), &record)
}

خصائص الذاكرة في البث

مع البث، يظل تخصيص الذاكرة في الكومة عند O(حجم السجل) بدلًا من O(حجم الملف). بالنسبة إلى ملف حجمه 1 GB يحتوي على سجلات حجم كل منها 1 KB، يستخدم البث نحو 1 KB، مقابل نحو 1 GB عند التحميل في الذاكرة.

إلغاء السياق أثناء البث

تحقق من ctx.Done() داخل حلقة فك الترميز لإيقاف البث عند إلغاء السياق، وبذلك تمنع goroutines من مواصلة القراءة حتى نهاية الملف.

for dec.More() {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
    }
    dec.Decode(&record)
}

تحقق سريع

ما ميزة بث JSON باستخدام json.Decoder مقارنةً باستخدام json.Unmarshal؟

مراجعة: بث JSON وCSV

النقاط الرئيسية:

  • json.Decoder: استخدم حلقة مع dec.More() لمصفوفات JSON
  • csv.NewReader: اقرأ صفًا تلو الآخر؛ واضبط Comma للفواصل المخصصة
  • NDJSON: استخدم bufio.Scanner مع Unmarshal لكل سطر
  • يحافظ البث على ثبات استهلاك الذاكرة بغض النظر عن حجم الملف

الأسئلة الشائعة

هل درس «بث JSON وCSV» مجاني؟

نعم — نص درس «بث JSON وCSV» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «بث JSON وCSV»؟

‏json.Decoder وencoding/csv للبيانات الكبيرة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «بث JSON وCSV»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. قراءة الملفات باستخدام os وbufio
  2. كتابة الملفات والملفات المؤقتة
  3. ترميز JSON وفك ترميزه
  4. بث JSON وCSV
← العودة إلى Go Academy