"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تبسيط القراءة والكتابة بتنسيق CSV في Go لتحسين الأداء؟

كيفية تبسيط القراءة والكتابة بتنسيق CSV في Go لتحسين الأداء؟

تم النشر بتاريخ 2024-11-15
تصفح:782

How to Streamline CSV Reading and Writing in Go for Improved Performance?

قراءة وكتابة فعالة لملفات CSV في Go

في كود Go المقدم، تسبب عملية القراءة والكتابة بتنسيق CSV مشكلات كبيرة في الأداء. لمعالجة هذه المشكلة، دعونا نستكشف طريقة بديلة تعمل على تبسيط هذه العمليات.

قراءة ملفات CSV بكفاءة

بدلاً من تحميل ملف CSV بأكمله في الذاكرة ثم معالجته، نحن يمكن الاستفادة من قدرة CSV.Reader على معالجة سطر واحد في كل مرة. وهذا يقلل بشكل كبير من استخدام الذاكرة ويحسن الأداء. يوضح مقتطف التعليمات البرمجية التالي هذا الأسلوب:

func processCSV(rc io.Reader) (ch chan []string) {
    ch = make(chan []string, 10)
    go func() {
        r := csv.NewReader(rc)
        if _, err := r.Read(); err != nil { //read header
            log.Fatal(err)
        }
        defer close(ch)
        for {
            rec, err := r.Read()
            if err != nil {
                if err == io.EOF {
                    break
                }
                log.Fatal(err)

            }
            ch  تأخذ هذه الوظيفة io.Reader كمدخل وترجع قناة تنتج شرائح من السلاسل التي تمثل سجلات CSV.

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

]وبالمثل، لكتابة ملفات CSV، يمكننا استخدام طريقة csv.Writer لكتابة سطر واحد في كل مرة لتحسين الأداء. يشبه رمز الكتابة الفعالة لملفات CSV إلى حد كبير قراءة ملف CSV:

func writeCSV(wc *csv.Writer, data [][]string) {
    go func() {
        defer wc.Flush(nil)
        for _, rec := range data {
            if err := wc.Write(rec); err != nil {
                log.Fatal(err)
            }
        }
    }()
}
تأخذ هذه الوظيفة ملف csv.Writer وشريحة من السلاسل (تمثل بيانات CSV) كمدخلات وتكتب البيانات بشكل غير متزامن في ملف CSV.

التكامل

مع وجود وظائف القراءة والكتابة المحسنة بتنسيق CSV، يمكن إعادة كتابة المنطق الرئيسي للبرنامج لاستخدام هذه الوظائف لتحسين الأداء:

func main() {
    recordsCh := processCSV(os.Open("./path/to/datafile.csv"))
    outfile, err := os.Create("./where/to/write/resultsfile.csv"))
    if err != nil {
        log.Fatal("Unable to open output")
    }
    defer outfile.Close()
    writer := csv.NewWriter(outfile)
    writer.Write([]string{"time", "value", "score"})
    for record := range recordsCh {
        time := record[0]
        value := record[1]
        
        // calculate scores; THIS EXTERNAL METHOD CANNOT BE CHANGED
        score := calculateStuff(value)
        
        valueString := strconv.FormatFloat(floatValue, 'f', 8, 64)
        scoreString := strconv.FormatFloat(prob, 'f', 8, 64)
        writer.Write([]string{time, valueString, scoreString})
    }
    writer.Flush()
}
يقرأ هذا الكود المنقح ملف CSV بكفاءة ويحسب النتائج بسرعة، مع الحفاظ على الأداء العالي لكل من القراءة والكتابة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3