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 = trueFehlerbehandlung und Validierung
CSV-Dateien enthalten oft Fehler: überflüssige Anführungszeichen, Nichtübereinstimmung der Anzahl
Auch in der Bibliothek
HTML-Parsing in Swift (iOS/macOS): Bibliotheken SwiftSoup und Fuzi
Clap für Rust: Vollständige Anleitung mit Beispielen
Caching in Go (Golang): Redis, In-Memory und andere Lösungen