قراءة وكتابة فعالة لملفات 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