Go:
עבודה עם קובצי CSV

איך לעשות:

עבודה עם קבצי CSV ב-Go היא ישירה, הודות לספריית התקן שלה, encoding/csv. להלן מבוא לקריאה וכתיבה של קבצי CSV.

קריאת קובץ CSV

כדי לקרוא מקובץ CSV, תחילה פתח את הקובץ באמצעות os.Open, לאחר מכן צור קורא CSV חדש עם csv.NewReader.

package main

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

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

    reader := csv.NewReader(file)
    records, err := reader.ReadAll()
    if err != nil {
        panic(err)
    }

    for _, record := range records {
        fmt.Println(record)
    }
}

קטע הקוד הזה יקרא את כל הרשומות מ-data.csv וידפיס אותן. כל רשומה היא מערך של שדות.

כתיבה לקובץ CSV

לכתיבה, אתה משתמש ב-csv.NewWriter ו-writer.WriteAll או writer.Write לכתיבה של מרובות או רשומה יחידה של רשומות 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()

    records := [][]string{
        {"Name", "Age", "City"},
        {"John Doe", "30", "New York"},
        {"Jane Doe", "27", "Los Angeles"},
    }

    if err := writer.WriteAll(records); err != nil {
        panic(err)
    }
}

זה יצור קובץ בשם output.csv עם הרשומות שסופקו. תמיד זכור לנקז את הכותב כדי לוודא שכל הנתונים בזיכרון המטמון נכתבו לקובץ.

היכרות מעמיקה

חבילת encoding/csv של Go מספקת תמיכה חזקה לקריאה וכתיבה של קבצי CSV אך היא מעוצבת עם פשטות בראש, מה שאומר שהיא לא מטפלת בתרחישים מורכבים יותר כמו זיהוי אוטומטי של מפרידים, התמודדות עם מרכאות או הפרדת שורות מוטמעות בשדות ללא טיפול ידני.

באופן היסטורי, טיפול ב-CSV בשפות תכנות לעיתים קרובות היה מסורבל בשל אותן מורכבויות, אך ספריית התקן של Go מפשטת רבות מהבעיות האלה, מה שמאפשר למפתחים לעבוד עם נתוני CSV ביחסית קלות. עם זאת, לניפוי CSV מורכב יותר, ייתכן שיהיה צורך בספריות צד שלישי כמו gocsv או בטיפול ידני בפרסור.

אחד היבט בולט בחבילת csv של Go הוא התמיכה שלה בציון פסיק מותאם אישית (מפריד), מה שמאפשר לה לעבוד בצורה חלקה עם וריאנטים של קבצי CSV, כמו ערכים מופרדים בטאבים (TSV). עם זאת, כאשר מתמודדים עם קבצי CSV פחות סדירים או לא תקניים, מתכנתי Go עשויים למצוא עצמם נזקקים להרחיב את היישומים הקיימים של קורא או כותב csv.

למרות שיכולות הטיפול ב-CSV של Go חזקות למטרות כלליות, ליישומים הדורשים מניפולציה אינטנסיבית של נתונים, כמו מדעי הנתונים או משימות המרת נתונים מורכבות, מתכנתים עשויים לעיין בחבילות עיבוד נתונים מוקדשות או אפילו בשפות אחרות המתאימות יותר למשימות אלו, כמו Python עם ספריית pandas. עם זאת, לפעולות קריאה-כתיבה פשוטות של CSV, ספריית התקן של Go בולטת ביעילותה ופשטותה.