0Pricing
Go Academy · Lezione

JSON e CSV in streaming

json.Decoder ed encoding/csv per grandi quantità di dati

JSON e CSV in streaming è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Perché utilizzare lo streaming?

Caricare interamente in memoria file JSON o CSV di grandi dimensioni causa un uso elevato dell'heap. Lo streaming elabora un record alla volta, mantenendo costante la memoria indipendentemente dalle dimensioni del file.

json.Decoder per lo streaming

json.NewDecoder avvolge qualsiasi io.Reader. Utilizzi Token() per percorrere il flusso dei token JSON oppure Decode all'interno di un ciclo per gli array JSON.

dec := json.NewDecoder(file)
// consume opening [
for dec.More() {
    var record Record
    dec.Decode(&record)
    process(record)
}

Rilevamento dell'inizio di un array

Chiami dec.Token() per consumare la parentesi di apertura prima del ciclo di decodifica:

t, _ := dec.Token() // consume [
for dec.More() {
    var r Record
    dec.Decode(&r)
}

Streaming da HTTP

Decodifichi il JSON direttamente dal body della risposta HTTP senza memorizzare l'intera risposta nel buffer:

resp, _ := http.Get(url)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
for dec.More() {
    var item Item
    dec.Decode(&item)
    process(item)
}

Reader di encoding/csv

csv.NewReader legge i record CSV uno alla volta. Imposti LazyQuotes, TrimLeadingSpace e Comment per gestire le varianti CSV del mondo reale.

r := csv.NewReader(file)
for {
    record, err := r.Read()
    if err == io.EOF { break }
    if err != nil { return err }
    process(record)
}

Ignorare l'intestazione CSV

Legga e scarti il primo record per ignorare la riga di intestazione:

r.Read() // discard header
for {
    record, err := r.Read()
    if err == io.EOF { break }
}

csv.Writer

Scriva i record CSV uno alla volta con csv.NewWriter. Chiami sempre w.Flush() e controlli w.Error() dopo la scrittura.

w := csv.NewWriter(file)
w.Write([]string{"name", "age"})
w.Flush()
if err := w.Error(); err != nil { return err }

Delimitatore personalizzato

I file CSV a volte utilizzano punti e virgola o tabulazioni. Imposti r.Comma sul rune desiderato.

r := csv.NewReader(file)
r.Comma = ';' // semicolon-separated

Streaming di righe JSON (NDJSON)

Il JSON delimitato da newline, con un oggetto JSON per riga, è semplice da elaborare in streaming: legga una riga alla volta ed esegua il unmarshaling di ogni riga indipendentemente.

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    var record Record
    json.Unmarshal(scanner.Bytes(), &record)
}

Profilo della memoria dello streaming

Con lo streaming, l'allocazione dell'heap rimane pari a O(dimensione del record) anziché O(dimensione del file). Per un file da 1 GB composto da record da 1 KB, lo streaming usa ~1 KB invece di ~1 GB per il caricamento in memoria.

Annullamento del contesto nello streaming

Controlli ctx.Done() all'interno del ciclo di decodifica per interrompere lo streaming quando il contesto viene annullato, evitando che le goroutine continuino a leggere fino a EOF.

for dec.More() {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
    }
    dec.Decode(&record)
}

Verifica rapida

Qual è il vantaggio dello streaming di JSON con json.Decoder rispetto a json.Unmarshal?

Riepilogo: streaming di JSON e CSV

Punti chiave:

  • json.Decoder: ciclo con dec.More() per gli array JSON
  • csv.NewReader: riga per riga; imposti Comma per i delimitatori personalizzati
  • NDJSON: bufio.Scanner + Unmarshal per ogni riga
  • Lo streaming mantiene stabile l'uso della memoria indipendentemente dalle dimensioni del file

Domande Frequenti

La lezione «JSON e CSV in streaming» è gratuita?

Sì — il testo completo di «JSON e CSV in streaming» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «JSON e CSV in streaming»?

json.Decoder ed encoding/csv per grandi quantità di dati Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «JSON e CSV in streaming»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Leggere file con os e bufio
  2. Scrivere file e file temporanei
  3. Codifica e decodifica JSON
  4. JSON e CSV in streaming
← Torna a Go Academy