0Pricing
Go Academy · บทเรียน

JSON และ CSV แบบสตรีม

json.Decoder และ encoding/csv สำหรับข้อมูลขนาดใหญ่

JSON และ CSV แบบสตรีม เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้สตรีม

การโหลดไฟล์ JSON หรือ CSV ขนาดใหญ่ทั้งหมดลงในหน่วยความจำทำให้ใช้ฮีปสูง การประมวลผลแบบสตรีมจะประมวลผลเรกคอร์ดทีละรายการ ทำให้การใช้หน่วยความจำคงที่โดยไม่ขึ้นกับขนาดไฟล์

json.Decoder สำหรับการประมวลผลแบบสตรีม

json.NewDecoder ห่อ io.Reader ใด ๆ ใช้ Token() เพื่อไล่ดูสตรีมโทเค็น JSON หรือใช้ Decode ภายในวนรอบสำหรับอาร์เรย์ JSON

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

การตรวจจับจุดเริ่มต้นของอาร์เรย์

เรียก dec.Token() เพื่ออ่านวงเล็บเปิดก่อนวนรอบการถอดรหัส:

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

การประมวลผลแบบสตรีมจาก HTTP

ถอดรหัส JSON โดยตรงจากเนื้อหาการตอบกลับ HTTP โดยไม่ต้องบัฟเฟอร์การตอบกลับทั้งหมด:

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

ตัวอ่าน encoding/csv

csv.NewReader อ่าน CSV ทีละแถว ตั้งค่า LazyQuotes, TrimLeadingSpace และ Comment เพื่อจัดการรูปแบบ CSV ที่พบในโลกจริง

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

การข้ามส่วนหัว CSV

อ่านและทิ้งเรกคอร์ดแรกเพื่อข้ามแถวส่วนหัว:

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

csv.Writer

เขียน CSV ทีละแถวด้วย csv.NewWriter เรียก w.Flush() เสมอ และตรวจสอบ w.Error() หลังเขียน

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

ตัวคั่นแบบกำหนดเอง

ไฟล์ CSV บางครั้งใช้เครื่องหมายอัฒภาคหรือแท็บ ให้ตั้งค่า r.Comma เป็นรูนที่ต้องการ

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

การประมวลผลบรรทัด JSON แบบสตรีม (NDJSON)

JSON แบบคั่นด้วยขึ้นบรรทัดใหม่ (ออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด) เหมาะสำหรับการประมวลผลแบบสตรีม เพียงอ่านทีละบรรทัดแล้วถอดรหัสแต่ละบรรทัดแยกจากกัน

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

การใช้หน่วยความจำขณะสตรีมข้อมูล

การสตรีมข้อมูลทำให้การจองหน่วยความจำบนฮีปคงอยู่ที่ O(ขนาดระเบียน) แทนที่จะเป็น O(ขนาดไฟล์) สำหรับไฟล์ขนาด 1 GB ที่มีระเบียนขนาด 1 KB การสตรีมข้อมูลจะใช้หน่วยความจำประมาณ 1 KB เทียบกับประมาณ 1 GB เมื่อโหลดข้อมูลทั้งหมดไว้ในหน่วยความจำ

การยกเลิก Context ระหว่างสตรีมข้อมูล

ตรวจสอบ ctx.Done() ภายในลูปถอดรหัส เพื่อยกเลิกการสตรีมข้อมูลเมื่อ Context ถูกยกเลิก และป้องกันไม่ให้โกโรทีนอ่านข้อมูลต่อจนถึง EOF

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

ตรวจสอบความเข้าใจ

ข้อดีของการสตรีม JSON ด้วย json.Decoder เมื่อเทียบกับ json.Unmarshal คืออะไร

ทบทวน: การสตรีม JSON และ CSV

ประเด็นสำคัญ:

  • json.Decoder: ใช้ลูปกับ dec.More() สำหรับอาร์เรย์ JSON
  • csv.NewReader: อ่านทีละแถว และกำหนด Comma เมื่อต้องการตัวคั่นแบบกำหนดเอง
  • NDJSON: ใช้ bufio.Scanner ร่วมกับ Unmarshal ทีละบรรทัด
  • การสตรีมข้อมูลทำให้การใช้หน่วยความจำคงที่ ไม่ว่าไฟล์จะมีขนาดเท่าใด

คำถามที่พบบ่อย

บทเรียน “JSON และ CSV แบบสตรีม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “JSON และ CSV แบบสตรีม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “JSON และ CSV แบบสตรีม”

json.Decoder และ encoding/csv สำหรับข้อมูลขนาดใหญ่ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “JSON และ CSV แบบสตรีม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อ่านไฟล์ด้วย os และ bufio
  2. การเขียนไฟล์และไฟล์ชั่วคราว
  3. การเข้ารหัสและถอดรหัส JSON
  4. JSON และ CSV แบบสตรีม
← กลับไปที่ Go Academy