Strumieniowe przetwarzanie JSON i CSV
json.Decoder i encoding/csv dla dużych ilości danych
Strumieniowe przetwarzanie JSON i CSV to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Dlaczego strumieniowanie?
Wczytywanie dużych plików JSON lub CSV w całości do pamięci powoduje duże zużycie sterty. Strumieniowanie przetwarza rekordy pojedynczo, utrzymując stałe zużycie pamięci niezależnie od rozmiaru pliku.
json.Decoder do strumieniowania
json.NewDecoder opakowuje dowolny io.Reader. Użyj Token(), aby przechodzić przez strumień tokenów JSON, lub wywołuj Decode w pętli dla tablic JSON.
dec := json.NewDecoder(file)
// consume opening [
for dec.More() {
var record Record
dec.Decode(&record)
process(record)
}Wykrywanie początku tablicy
Wywołaj dec.Token(), aby odczytać otwierający nawias przed pętlą dekodowania:
t, _ := dec.Token() // consume [
for dec.More() {
var r Record
dec.Decode(&r)
}Strumieniowanie z HTTP
JSON można dekodować bezpośrednio z ciała odpowiedzi HTTP bez buforowania całej odpowiedzi:
resp, _ := http.Get(url)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
for dec.More() {
var item Item
dec.Decode(&item)
process(item)
}Czytnik encoding/csv
csv.NewReader odczytuje wiersze CSV pojedynczo. Ustawienia LazyQuotes, TrimLeadingSpace i Comment pozwalają obsługiwać warianty CSV spotykane w praktyce.
r := csv.NewReader(file)
for {
record, err := r.Read()
if err == io.EOF { break }
if err != nil { return err }
process(record)
}Pomijanie nagłówka CSV
Należy odczytać i odrzucić pierwszy rekord, aby pominąć wiersz nagłówka:
r.Read() // discard header
for {
record, err := r.Read()
if err == io.EOF { break }
}csv.Writer
Wiersze CSV można zapisywać pojedynczo za pomocą csv.NewWriter. Po zapisie należy zawsze wywołać w.Flush() i sprawdzić w.Error().
w := csv.NewWriter(file)
w.Write([]string{"name", "age"})
w.Flush()
if err := w.Error(); err != nil { return err }Niestandardowy separator
Pliki CSV czasami używają średników lub tabulatorów. Ustaw r.Comma na żądany znak runowy.
r := csv.NewReader(file)
r.Comma = ';' // semicolon-separatedStrumieniowanie wierszy JSON (NDJSON)
JSON rozdzielany znakami nowego wiersza (jeden obiekt JSON w każdym wierszu) można łatwo strumieniować: odczytywać wiersz po wierszu i niezależnie dekodować każdy z nich.
scanner := bufio.NewScanner(file)
for scanner.Scan() {
var record Record
json.Unmarshal(scanner.Bytes(), &record)
}Strumieniowanie a profil pamięci
W przypadku strumieniowania alokacja sterty utrzymuje się na poziomie O(rozmiar rekordu), a nie O(rozmiar pliku). Dla pliku o rozmiarze 1 GB zawierającego rekordy po 1 KB strumieniowanie wykorzystuje około 1 KB, podczas gdy wczytanie do pamięci zajęłoby około 1 GB.
Anulowanie kontekstu podczas strumieniowania
W pętli dekodowania należy sprawdzać ctx.Done(), aby przerwać strumieniowanie po anulowaniu kontekstu i zapobiec odczytywaniu danych przez goroutines aż do EOF.
for dec.More() {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
dec.Decode(&record)
}Szybkie sprawdzenie
Jaka jest przewaga strumieniowego przetwarzania JSON za pomocą json.Decoder nad json.Unmarshal?
Podsumowanie: strumieniowanie JSON i CSV
Najważniejsze informacje:
- json.Decoder: pętla z dec.More() dla tablic JSON
- csv.NewReader: odczyt wiersz po wierszu; ustawienie Comma dla niestandardowych separatorów
- NDJSON: bufio.Scanner + wywołanie Unmarshal dla każdego wiersza
- Strumieniowanie utrzymuje stałe zużycie pamięci niezależnie od rozmiaru pliku
Często zadawane pytania
Czy lekcja „Strumieniowe przetwarzanie JSON i CSV” jest bezpłatna?
Tak — pełny tekst „Strumieniowe przetwarzanie JSON i CSV” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Strumieniowe przetwarzanie JSON i CSV”?
json.Decoder i encoding/csv dla dużych ilości danych Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Strumieniowe przetwarzanie JSON i CSV”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Odczytywanie plików za pomocą os i bufio
- Zapisywanie plików i pliki tymczasowe
- Kodowanie i dekodowanie JSON
- Strumieniowe przetwarzanie JSON i CSV