Arbeiten mit CSV in Go (Golang): Vollständige Anleitung zum Parsen und Schreiben

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit CSV in Go (Golang): Parsen, Schreiben und Datenverarbeitung

CSV (Comma-Separated Values) ist eines der am weitesten verbreiteten Formate für den Austausch von Tabellendaten. In Go (Golang) wird die Arbeit mit CSV nativ über das Standardpaket encoding/csv realisiert, was es zu einem praktischen und leistungsstarken Werkzeug macht. In diesem Artikel werden wir im Detail besprechen, wie man CSV-Dateien in Go liest, erstellt und verarbeitet, einschließlich der Arbeit mit großen Datenmengen, der Konfiguration von Trennzeichen und der Fehlerbehandlung.



Das Paket encoding/csv: Grundlagen

Das Paket encoding/csv bietet zwei Haupttypen: Reader zum Lesen von CSV und Writer zum Schreiben. Es unterstützt die Standard-CSV-Regeln (RFC 4180) und ermöglicht eine flexible Konfiguration von Parametern wie Trennzeichen, Kommentaren und der Behandlung von Anführungszeichen.

Um zu beginnen, reicht es aus, das Paket zu importieren:

import "encoding/csv"


Lesen einer CSV-Datei

Betrachten wir ein einfaches Beispiel zum zeilenweisen Lesen einer CSV-Datei:

package main

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

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

// Reader erstellen reader := csv.NewReader(file)

// Alle Datensätze lesen records, err := reader.ReadAll() if err != nil { panic(err) }

// Daten ausgeben for i, record := range records { fmt.Printf("Zeile %d: %v", i, record) }}

Wichtig: ReadAll() lädt die gesamte Datei in den Arbeitsspeicher. Verwenden Sie für große Dateien das zeilenweise Lesen mit Read().



Zeilenweises Lesen großer CSV-Dateien

Für die Verarbeitung großer Datenmengen (Gigabyte) verwenden Sie iteratives Lesen:

reader := csv.NewReader(file)for {    record, err := reader.Read()    if err != nil {        // Dateiende        if err.Error() == "EOF" {            break        }        panic(err)    }    // Datensatz verarbeiten    fmt.Println(record)}


Schreiben in eine CSV-Datei

Das Erstellen einer CSV-Datei ist ebenfalls intuitiv:

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() // Wichtig: Puffer leeren

// Kopfzeilen schreiben writer.Write([]string{"Name", "Alter", "Stadt"}) // Daten schreiben writer.Write([]string{"Alice", "30", "Moskau"}) writer.Write([]string{"Bob", "25", "Sankt Petersburg"})}

Vergessen Sie nicht, nach allen Schreibvorgängen Flush() aufzurufen, da sonst Daten verloren gehen können.



Konfiguration des Trennzeichens und anderer Parameter

Standardmäßig wird ein Komma verwendet, aber Sie können das Trennzeichen ändern, z. B. auf Semikolon (TSV — Tabulator):

reader := csv.NewReader(file)reader.Comma = ';'  // Für TSV: '\\t'

// Für das Schreiben:writer := csv.NewWriter(file)writer.Comma = ';'

Weitere nützliche Parameter:

  • LazyQuotes — erlaubt Anführungszeichen an nicht standardmäßigen Stellen (Standardwert false)
  • FieldsPerRecord — Überprüfung der Feldanzahl (negativer Wert deaktiviert die Überprüfung)
  • Comment — Kommentarzeichen (z. B. '#'), Zeilen damit werden übersprungen
  • TrimLeadingSpace — automatisches Entfernen von Leerzeichen am Anfang von Feldern

Beispiel mit Konfiguration:

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


Fehlerbehandlung und Validierung

CSV-Dateien enthalten oft Fehler: überflüssige Anführungszeichen, Nichtübereinstimmung der Anzahl

Empfehlungen